--- a/accessoryservices/accessoryserver/group/bld.inf Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/accessoryserver/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -39,7 +39,6 @@
//Accessory Control
../data/hwdevices.ini /epoc32/winscw/c/private/1020504a/hwdevices.ini
-../inc/Common/accessoryservicesinternalpskeys.h |../../../inc/accessoryservicesinternalpskeys.h
PRJ_MMPFILES
--- a/accessoryservices/accessoryserver/inc/Common/accessoryservicesinternalpskeys.h Wed Sep 29 15:13:21 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-/*
-* Copyright (c) 2008 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: Internal Publish&Subscribe definitions of the
-* Accessory Services
-*
-*/
-
-
-#ifndef ACCESSORYSERVICESINTERNALPSKEYS_H
-#define ACCESSORYSERVICESINTERNALPSKEYS_H
-
-#include <e32cmn.h>
-
-static const TUid KPSUidAccessoryServices = { 0x10205030 };
-
-// =============================================================================
-// Accessory Services Wired Connection API
-// =============================================================================
-// Use TUid KPSUidAccessoryServices = { 0x10205030 }
-
-/**
-* Notified when a wired accessory is physically connected or disconnected.
-*/
-const TUint32 KAccSrvcsWiredConnection = 0x00000001;
-enum TAccSrvcsWiredConnection
- {
- EAccSrvcsWiredConnUninitialized = 0,
- EAccSrvcsWiredConnConnected,
- EAccSrvcsWiredConnDisconnected
- };
-
-
-#endif ACCESSORYSERVICESINTERNALPSKEYS_H
--- a/accessoryservices/accessoryserver/src/Server/AccSrvWiredConnectionPublisher.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/accessoryserver/src/Server/AccSrvWiredConnectionPublisher.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -16,7 +16,7 @@
*/
-#include <accessoryservicesinternalpskeys.h>
+#include <accessoryservicespskeys.h>
#include "AccSrvWiredConnectionPublisher.h"
#include "acc_debug.h"
--- a/accessoryservices/accessoryserver/tsrc/public/basic/AccessoryTestControl/AccessoryTestControlPlugin/src/TfAccessoryTestControl.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/accessoryserver/tsrc/public/basic/AccessoryTestControl/AccessoryTestControlPlugin/src/TfAccessoryTestControl.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4698 +1,4699 @@
-/*
- * Copyright (c) 2005 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:
- *
- */
-
-// INCLUDE FILES
-
-#include <ctffactory.h>
-#include <tftypes.h>
-#include <AccPolSubblockNameArray.h>
-#include "siftrace.h"
-#include "CtfAccessoryTestcontrol.h"
-#include "CtfAccessoryTestCaseControl.h"
-#include <AccPolProprietaryNameValuePairs.h>
-#include <AccConGenericID.h>
-#include <AccPolPropGenericid.h>
-#include <AccessoryConnectionBase.h>
-#include <s32mem.h>
-
-#include <accpolobjectcon.h>
-#include <accpolaudiostreamformat.h>
-#include <accpolterminalbase.h>
-#include <accpoloutputterminal.h>
-#include <accpolinputterminal.h>
-#include <accpolmixerunit.h>
-#include <accpolfeatureunit.h>
-#include <accpolvolumecontrol.h>
-#include <accpolmutecontrol.h>
-#include <accpolselectorunit.h>
-
-#include <StartupDomainPSKeys.h>
-
-#include <E32Math.h>
-#include "AccClientServerMessages.h"
-#include <e32property.h>
-
-#include <accpolhdmiobjectcon.h>
-#include <tvoutconfigdef.h>
-
-//
-// ----------------------------------------------------------------------------------
-// MTFAccessoryTestControl* GetAccessoryTestControl
-// ----------------------------------------------------------------------------------
-MTFAccessoryTestControl* GetAccessoryTestControl( void )
- {
- CTFStub* stub = CTFFactory::Stub( KTFStubTypeAccessoryControl );
- return STATIC_CAST( CTFAccessoryTestControl*, stub );
- }
-//
-// ----------------------------------------------------------------------------------
-// MTFAccessoryTestControl::MTFAccessoryTestControl
-// ----------------------------------------------------------------------------------
-MTFAccessoryTestControl::MTFAccessoryTestControl( void )
- {
- }
-//
-// ----------------------------------------------------------------------------------
-// MTFAccessoryTestControl::~MTFAccessoryTestControl
-// ----------------------------------------------------------------------------------
-MTFAccessoryTestControl::~MTFAccessoryTestControl( void )
- {
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CTFAccessoryTestControl
-// ----------------------------------------------------------------------------------
-CTFAccessoryTestControl::CTFAccessoryTestControl( void ) :
- CTFRemoteStub( KTFStubTypeAccessoryControl ),
- iStack( CTFTestControlObserver::iOffset ), iStackIter( iStack )
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CTFAccessoryTestControl()" ) ) );
-
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CTFAccessoryTestControl() - return" ) ) );
- }
-
-//lint -e1740 Pointer not directly deleted by destructor
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::~CTFAccessoryTestControl
-// ----------------------------------------------------------------------------------
-CTFAccessoryTestControl::~CTFAccessoryTestControl( void )
- {
-
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::~CTFAccessoryTestControl()" ) ) );
- RProperty::Delete( KTFAccessoryTestProperty, KTFAccessoryMethod );
-
- ResetAccessoryServices();
-
- iAccessoryServer.Disconnect();
-
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::~CTFAccessoryTestControl() - Accessory Server connection closed" ) ) );
-
- }
-//lint +e1740
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::InitializeL
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::InitializeL( void )
- {
-
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::InitializeL( void ) - enter" ) ) );
- TInt retval( KErrNone );
-
- iAccessoryConnection = NULL;
- iAccessorySingleConnection = NULL;
- iAccessoryControl = NULL;
- iAccessorySettings = NULL;
- iAccessoryMode = NULL;
- iAccessoryAudioControl = NULL;
- iAccessoryBTControl = NULL;
-
- iStreamContainer = NULL;
- iTopologyContainer = NULL;
- iSpeakerRightVolume = NULL;
- iSpeakerLeftVolume = NULL;
- iSpeakerMute = NULL;
- iMicRightVolume = NULL;
- iMicLeftVolume = NULL;
-
- TAccPolGenericID emptyInstance;
- for( TInt i( 0 ); i < 10; i++ )
- {
- iGenericId[i] = emptyInstance;
- }
-
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::InitializeL()" ) ) );
-
- User::LeaveIfError( iAccessoryServer.Connect() );
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::InitializeL() - Connected to accessory server" ) ) );
-
- retval = RProperty::Define( KTFAccessoryTestProperty,
- KTFAccessoryMethod,
- RProperty::EByteArray );
- if( retval != KErrAlreadyExists )
- User::LeaveIfError( retval );
- //attach to property
-
-
- RProperty systemState;
- User::LeaveIfError( systemState.Attach( KPSUidStartup, KPSGlobalSystemState ) );
- TInt value( KErrNone );
- //check value
- TInt err = systemState.Get( value );
-
- if( err != KErrNone )
- {
- err = systemState.Define( KPSUidStartup,
- KPSGlobalSystemState,
- RProperty::EInt );
- TInt err = systemState.Get( value );
- }
-
- if( value != ESwStateNormalRfOn || value != ESwStateNormalRfOff || value
- != ESwStateNormalBTSap )
- {
- TInt err = systemState.Set( KPSUidStartup,
- KPSGlobalSystemState,
- ESwStateNormalRfOn );
- }
-
- iInitialized = ETrue;
-
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::InitializeL - return" ) ) );
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::InitializeL( void ) - return" ) ) );
- }
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::ResetAccessoryServices
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::ResetAccessoryServices( void )
- {
- ResetAccessoryServer();
-
- iInitialized = EFalse;
-
- iAccessoryServer.Close();
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::ResetAccessoryServer
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::ResetAccessoryServer( void )
- {
-
- COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::ResetAccessoryServer()" ) ) );
-
- CTFTestControlObserver* observerItem;
- if( !iStack.IsEmpty() )
- {
- iStackIter.SetToFirst();
-
- while( ( observerItem = iStackIter++ ) != NULL )
- {
- observerItem->Cancel();
- User::After( 2000000 );
- iStack.Remove( *observerItem );
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Remove Observer" ) ) );
- delete observerItem;
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Delete Observer" ) ) );
- };
- }
-
- iStack.Reset();
-
- TAccPolGenericID emptyInstance;
-
- for( TInt i( 0 ); i < 10; i++ )
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Clear instances" ) ) );
- if( KErrNotFound != iGenericId[i].UniqueID() )
- {
- if( iGenericId[i].PhysicalConnectionCaps( KPCBluetooth ) )
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- BT Found" ) ) );
- TBTDevAddr BTDevAddr( iGenericId[i].DeviceAddress() );
- if( iAccessoryBTControl != NULL )
- {
- TRequestStatus status;
- status = KRequestPending;
- iAccessoryBTControl->DisconnectAccessory( status, BTDevAddr );
- User::WaitForRequest( status );
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- BT Disconnected" ) ) );
- }
- }
- else
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Wired Found" ) ) );
- TPckgBuf<TTFAccessoryPublishAndSubscribe> buf;
- buf().iMethod = ETFAsyDisc;
- User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty,
- KTFAccessoryMethod,
- buf ) );
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Wired Disconnected" ) ) );
- }
- }
- iGenericId[i] = emptyInstance;
- }
-
- if( iAccessoryConnection != NULL )
- {
- iAccessoryConnection->CloseSubSession();
- delete iAccessoryConnection;
- iAccessoryConnection = NULL;
- }
-
- if( iAccessorySingleConnection != NULL )
- {
- iAccessorySingleConnection->CloseSubSession();
- delete iAccessorySingleConnection;
- iAccessorySingleConnection = NULL;
- }
- if( iAccessoryControl != NULL )
- {
- iAccessoryControl->CloseSubSession();
- delete iAccessoryControl;
- iAccessoryControl = NULL;
- }
- if( iAccessorySettings != NULL )
- {
- iAccessorySettings->CloseSubSession();
- delete iAccessorySettings;
- iAccessorySettings = NULL;
- }
- if( iAccessoryMode != NULL )
- {
- iAccessoryMode->CloseSubSession();
- delete iAccessoryMode;
- iAccessoryMode = NULL;
- }
-
- if( iAccessoryAudioControl != NULL )
- {
- iAccessoryAudioControl->CloseSubSession();
- delete iAccessoryAudioControl;
- iAccessoryAudioControl = NULL;
- }
-
- if( iAccessoryBTControl != NULL )
- {
- iAccessoryBTControl->CloseSubSession();
- delete iAccessoryBTControl;
- iAccessoryBTControl = NULL;
- }
-
- if( iSpeakerRightVolume != NULL )
- {
- delete iSpeakerRightVolume;
- iSpeakerRightVolume = NULL;
- }
-
- if( iSpeakerLeftVolume != NULL )
- {
- delete iSpeakerLeftVolume;
- iSpeakerLeftVolume = NULL;
- }
-
- if( iSpeakerMute != NULL )
- {
- delete iSpeakerMute;
- iSpeakerMute = NULL;
- }
-
- if( iMicRightVolume != NULL )
- {
- delete iMicRightVolume;
- iMicRightVolume = NULL;
- }
-
- if( iMicLeftVolume != NULL )
- {
- delete iMicLeftVolume;
- iMicLeftVolume = NULL;
- }
-
- if( iStreamContainer != NULL )
- {
- delete iStreamContainer;
- iStreamContainer = NULL;
- }
-
- if( iTopologyContainer != NULL )
- {
- delete iTopologyContainer;
- iTopologyContainer = NULL;
- }
-
- COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::ResetAccessoryServer() - Success" ) ) );
- }
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CancelOutStandingRequest
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::CancelOutStandingRequest()
- {
- iObserverItem->Cancel();
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::FillObjectL
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::FillObjectL( CAccPolAudioStreamFormatCon* aContainer,
- TStreamConObjectType aobjectType,
- TInt64 aNumberOfObjects )
- {
-
- for( TInt i = 0; i < aNumberOfObjects; i++ )
- {
- switch( aobjectType )
- {
- case EAccPolAudioInputStreamObject:
- {
- CAccPolAudioStreamFormat* stream =
- CAccPolAudioStreamFormat::NewLC( aobjectType,
- i,
- KUidFormatPCM16,
- CAccPolAudioStreamFormat::EStereo,
- CAccPolAudioStreamFormat::EBitsPerSample16,
- i + 200 );
- aContainer->AddL( *stream );
- CleanupStack::PopAndDestroy( stream );
- }
- break;
-
- case EAccPolAudioOutputStreamObject:
- {
-
- CAccPolAudioStreamFormat
- * stream =
- CAccPolAudioStreamFormat::NewLC( EAccPolAudioOutputStreamObject );
-
- stream->SetUnitId( i );
- stream->SetAudioFormat( KUidFormatPCM16 );
- stream->SetStreamType( CAccPolAudioStreamFormat::EMono );
- stream->SetBitResolution( CAccPolAudioStreamFormat::EBitsPerSample32 );
- stream->SetSamFreq( i + 200 );
-
- aContainer->AddL( *stream );
- CleanupStack::PopAndDestroy( stream );
- }
- break;
-
- default:
- {
- TRACE_ASSERT_ALWAYS;
- }
- break;
- }
- }
-
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CreateObjectPubSub
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::CreateObjectPubSubL( TStreamConObjectType aobjectType,
- TInt64 aNumberOfObjects,
- TStreamConObjectType aobjectType2,
- TInt64 aNumberOfObjects2 )
- {
- RProperty prop;
- prop.Define( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- RProperty::EByteArray );
-
- CAccPolAudioStreamFormatCon* container =
- CAccPolAudioStreamFormatCon::NewLC();
-
- FillObjectL( container, aobjectType, aNumberOfObjects );
- FillObjectL( container, aobjectType2, aNumberOfObjects2 );
-
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- //Externalize container to buf
- RBufWriteStream wStrm;
- ( void )wStrm.Open( *buf );
- wStrm.PushL();
- container->ExternalizeL( wStrm );
- wStrm.CommitL();
- wStrm.Close();
- wStrm.Pop();
-
- TPtr8 ptr( buf->Ptr( 0 ) );
-
- TInt retval = prop.Set( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- ptr );
-
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( container );
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CreateObjectPubSub
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::CreateTopologyObjectsToPubSubL(
- TTFAccessoryTestCaseStateControl& aParameter )
- {
- RProperty prop;
- prop.Define( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- RProperty::EByteArray );
-
- CAccPolAudioTopologyObjectCon* aObject =
- CAccPolAudioTopologyObjectCon::NewLC();
-
- //Speaker
- //OT-3
- CAccPolOutputTerminal* OT3 = CAccPolOutputTerminal::NewLC( 3,
- CAccPolOutputTerminal::EAPTHeadphone,
- 2 );
- //Connected to FU-2
- aObject->AddL( *OT3 );
-
- //FU2
- CAccPolFeatureUnit* FU2 = CAccPolFeatureUnit::NewLC( 2, 8 );
- // Volume control object.
- CAccPolVolumeControl* speakerRightVolume =
- CAccPolVolumeControl::NewLC( KAccRightFrontChannel, 7, 5, 20, 5 );
- CAccPolVolumeControl* speakerLeftVolume =
- CAccPolVolumeControl::NewLC( KAccLeftFrontChannel, 7, 5, 20, 5 );
-
- CAccPolMuteControl* speakermute =
- CAccPolMuteControl::NewLC( KAccMasterChannel, ETrue );
-
- FU2->AddControlL( *speakerRightVolume );
- FU2->AddControlL( *speakerLeftVolume );
- FU2->AddControlL( *speakermute );
-
- //Connected to MU-8
- aObject->AddL( *FU2 );
-
- CAccPolMixerUnit* MU8 = CAccPolMixerUnit::NewLC( 8 );
- MU8->AddSourceIdL( 1 );
- MU8->AddSourceIdL( 7 );
-
- //Connected to IT1 and FU7
- aObject->AddL( *MU8 );
-
- //Choice one
- //IT-1
- TUint8 aChannelCount = 2;
- TUint16 aChannelConfig = 0;
- aChannelConfig = aChannelConfig | KAccRightFrontChannel;
- aChannelConfig = aChannelConfig | KAccLeftFrontChannel;
-
- CAccPolInputTerminal* IT1 = CAccPolInputTerminal::NewLC( 1,
- CAccPolInputTerminal::EAPTStream,
- aChannelCount,
- aChannelConfig );
- aObject->AddL( *IT1 );
-
- //choice two
- //FU7
- CAccPolFeatureUnit* FU7 = CAccPolFeatureUnit::NewLC( 7, 5 ); //Connected to FU5
- // Volume control object.
- CAccPolVolumeControl* sidetoneRightVolume =
- CAccPolVolumeControl::NewLC( KAccMasterChannel, 7, 5, 20, 5 );
- CAccPolVolumeControl* sidetoneLeftVolume =
- CAccPolVolumeControl::NewLC( KAccMasterChannel, 7, 5, 20, 5 );
-
- FU7->AddControlL( *sidetoneRightVolume );
- FU7->AddControlL( *sidetoneLeftVolume );
-
- aObject->AddL( *FU7 );
-
- //Microphone
- //IT-4
-
- //OT-6
- CAccPolOutputTerminal* OT6 = CAccPolOutputTerminal::NewLC( 6,
- CAccPolOutputTerminal::EAPTStream,
- 10 );
- //Connected to SU-10
- aObject->AddL( *OT6 );
-
- //SU-10
- CAccPolSelectorUnit* SU10 = CAccPolSelectorUnit::NewLC( 10, 1 );
-
- // Connected to FU 5
- SU10->AddSourceIdL( 5 );
- aObject->AddL( *SU10 );
-
- //FU5
- CAccPolFeatureUnit* FU5 = CAccPolFeatureUnit::NewLC( 5, 9 );
-
- // Volume control object.
- CAccPolVolumeControl* micRightVolume =
- CAccPolVolumeControl::NewLC( KAccRightFrontChannel, 7, 5, 20, 5 );
- CAccPolVolumeControl* micLeftVolume =
- CAccPolVolumeControl::NewLC( KAccLeftFrontChannel, 7, 5, 20, 5 );
- CAccPolMuteControl* micmute = CAccPolMuteControl::NewLC( KAccMasterChannel,
- ETrue );
-
- FU5->AddControlL( *micRightVolume );
- FU5->AddControlL( *micLeftVolume );
- FU5->AddControlL( *micmute );
-
- //Connected to FU-9
- aObject->AddL( *FU5 );
-
- ///FU9
- CAccPolFeatureUnit* FU9 = CAccPolFeatureUnit::NewLC( 9, 4 );
- //Connected IT-4
- aObject->AddL( *FU9 );
-
- CAccPolInputTerminal* IT4 = CAccPolInputTerminal::NewLC( 4,
- CAccPolInputTerminal::EAPTMicrophone,
- aChannelCount,
- aChannelConfig );
- aObject->AddL( *IT4 );
-
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- //Externalize container to buf
- RBufWriteStream wStrm;
- ( void )wStrm.Open( *buf );
- wStrm.PushL();
- aObject->ExternalizeL( wStrm );
- wStrm.CommitL();
- wStrm.Close();
- wStrm.Pop();
- TPtr8 ptr( buf->Ptr( 0 ) );
- TInt retval = prop.Set( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- ptr );
-
- // Notify ASY stub
- if( aParameter.iArg2 )
- {
- PublishAndSubscribeL( aParameter );
- }
-
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( IT4 );
- CleanupStack::PopAndDestroy( FU9 );
- CleanupStack::PopAndDestroy( micmute );
- CleanupStack::PopAndDestroy( micLeftVolume );
- CleanupStack::PopAndDestroy( micRightVolume );
- CleanupStack::PopAndDestroy( FU5 );
- CleanupStack::PopAndDestroy( SU10 );
- CleanupStack::PopAndDestroy( OT6 );
- CleanupStack::PopAndDestroy( sidetoneLeftVolume );
- CleanupStack::PopAndDestroy( sidetoneRightVolume );
- CleanupStack::PopAndDestroy( FU7 );
- CleanupStack::PopAndDestroy( IT1 );
- CleanupStack::PopAndDestroy( MU8 );
- CleanupStack::PopAndDestroy( speakermute );
- CleanupStack::PopAndDestroy( speakerLeftVolume );
- CleanupStack::PopAndDestroy( speakerRightVolume );
- CleanupStack::PopAndDestroy( FU2 );
- CleanupStack::PopAndDestroy( OT3 );
- CleanupStack::PopAndDestroy( aObject );
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CallAccessoryFunctionL
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::CallAccessoryFunctionL( TTFAccessoryTestCaseStateControl& aParameter )
- {
-
- // COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CallAccessoryFunctionL(%d, %d, %d)" ), aParameter.iAccessoryFunction, aParameter.iArg1, aParameter.iArg2 ) );
- if( !iInitialized )
- {
- InitializeL();
- }
-
- TInt retval = KTFErrAccessoryServiceMissing;
-
- switch( aParameter.iAccessoryFunction )
- {
- case ETFAccessorySet_ObjectPubSub:
- {
- CreateObjectPubSubL( ( TStreamConObjectType )aParameter.iArg1,
- aParameter.iArg2,
- ( TStreamConObjectType )aParameter.iArg3,
- aParameter.iArg4 );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessorySet_TopologyObjectsPubSub:
- {
- CreateTopologyObjectsToPubSubL( aParameter );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessorySet_PubSub:
- {
- RProperty prop;
- prop.Define( KTFAccessoryTestProperty,
- KTFAccessoryNotifierMethod,
- RProperty::EInt );
- retval = prop.Set( KTFAccessoryTestProperty,
- KTFAccessoryNotifierMethod,
- aParameter.iArg1 );
- }
- break;
-
- case ETFConnectWiredAccessory:
- {
- PublishAndSubscribeL( aParameter );
- retval = KErrNone;
- }
- break;
-
- case ETFClearStack:
- {
- CTFTestControlObserver* observerItem;
- TInt count = 0;
- if( !iStack.IsEmpty() )
- {
- iStackIter.SetToFirst();
-
- while( ( observerItem = iStackIter++ ) != NULL )
- {
- observerItem->Cancel();
- iStack.Remove( *observerItem );
- delete observerItem;
- count++;
- };
- }
-
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestCaseControl::ETF_Pappa - count=%d " ), count ) );
- retval = KErrNone;
- }
- break;
-
- case ETFDisconnectWiredAccessory:
- {
- retval = KErrNone;
- PublishAndSubscribeL( aParameter );
- TAccPolGenericID emptyInstance;
- iGenericId[aParameter.iGid] = emptyInstance;
- }
- break;
-
- case ETFCheckCapabilityGroup:
- {
- if( aParameter.iArg2
- == iGenericId[aParameter.iGid].SubblockCaps( aParameter.iArg3 ) )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrNotFound;
- }
- }
- break;
-
- case ETFCheckCapability:
- {
- RAccessoryConnection accessoryConnectionn;
- accessoryConnectionn.CreateSubSession( iAccessoryServer );
-
- CAccPolSubblockNameArray* nameArrayy =
- CAccPolSubblockNameArray::NewL();
- CleanupStack::PushL( nameArrayy );
- accessoryConnectionn.GetSubblockNameArrayL( iGenericId[aParameter.iGid],
- *nameArrayy );
-
- if( aParameter.iArg2 == nameArrayy->HasName( aParameter.iArg3 ) )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrNotFound;
- }
-
- CleanupStack::PopAndDestroy( nameArrayy );
- accessoryConnectionn.CloseSubSession();
- }
- break;
-
- case ETFFindAndCheckRequest:
-
- {
- FindAndCheckRequestL(&retval, aParameter);
- }
- break;
-
- case ETFFindAndCheckObjectRequest:
- {
- CTFAccessoryTestCaseControl* testCase = STATIC_CAST( CTFAccessoryTestCaseControl*, CurrentTestCase());
- TRACE_ASSERT( testCase != NULL );
- if( testCase != NULL )
- {
- if( !iStack.IsEmpty() )
- {
- iStackIter.SetToFirst();
-
- while( ( iObserverItem = iStackIter++ ) != NULL )
- {
- if( iObserverItem->FindRequest( aParameter.iRequestType ) )
- {
- testCase->CheckObjectRequest( iObserverItem->iStatus,
- iObserverItem->iObjectValue,
- iObserverItem->iCapabilityName );
-
- if( !iStack.IsEmpty() ) // Check if observes are already deleted by CheckRequest()
- {
- if( KTFDontDeleteObserver != aParameter.iArg1 )
- {
- iStack.Remove( *iObserverItem );
- delete iObserverItem;
- return;
- }
- else
- {
- User::Leave( KTFDontDeleteObserver );
- }
- }
- else
- {
- retval = KErrGeneral;
- }
- }
- }
- }
- else
- {
- retval = KErrGeneral;
- }
- }
-
- retval = KErrNone;
- }
- break;
-
- //
- // Accessory Connection
- //
- case ETFAccessoryConnection_Open:
- {
- AccessoryConnectionOpenClose(ETFAccessoryConnection_Open, &retval);
- }
- break;
-
- case ETFAccessoryConnection_Close:
-
- {
- AccessoryConnectionOpenClose(ETFAccessoryConnection_Close, &retval);
- }
- break;
-
- //
- // Accessory Settings
- //
- case ETFAccessorySettings_Open:
- {
- AccessorySettingsOpenClose(ETFAccessorySettings_Open, &retval);
- }
- break;
-
- case ETFAccessorySettings_Close:
- {
- AccessorySettingsOpenClose(ETFAccessorySettings_Close, &retval);
- }
- break;
-
- case ETFSetHWDeviceSettings:
- {
- retval
- = iAccessorySettings->SetHWDeviceSettingsL( aParameter.iArg1,
- ( TBool )aParameter.iArg2 );
- }
- break;
-
- case ETFGetHWDeviceSettings:
- {
- TUint32 aSettingsValue( 0 );
- retval = iAccessorySettings->GetHWDeviceSettings( aSettingsValue );
-
- if( aSettingsValue != aParameter.iArg1 )
- {
- retval = KErrArgument;
- }
- }
- break;
-
- case ETFGetSupportedHWDeviceSettings:
- {
- TUint32 aSettingsSupportedValue( 0 );
-
- retval
- = iAccessorySettings->GetSupportedHWDeviceSettings( aSettingsSupportedValue );
-
- if( aSettingsSupportedValue != ( aParameter.iArg1
- | aParameter.iArg2 ) )
- {
- retval = KErrArgument;
- }
- }
- break;
-
- case ETFSetIntAccessoryModeSetting:
- {
- TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
- TAccModeSetting aSetting;
-
- //Set Lights
- aSetting.SetId( aParameter.iArg2 );
- aSetting.SetTInt( aParameter.iArg4 );
-
- retval = iAccessorySettings->SetAccessoryModeSettingL( aAccMode,
- aSetting );
- }
- break;
-
- case ETFSetBoolAccessoryModeSetting:
- {
- TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
- TAccModeSetting aSetting;
-
- //Set Lights
- aSetting.SetId( aParameter.iArg2 );
- aSetting.SetTBool( aParameter.iArg4 );
-
- retval = iAccessorySettings->SetAccessoryModeSettingL( aAccMode,
- aSetting );
- }
- break;
-
- case ETFSetDesAccessoryModeSetting:
- {
- TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
- TAccModeSetting aSetting;
-
- TBuf<KMaxAccModeSetting> buf;
- buf.Num( aParameter.iArg3 );
- // buf.Copy( *aParameter.iArg3 );
-
- aSetting.SetId( aParameter.iArg2 );
- aSetting.SetTDes( buf );
- retval = iAccessorySettings->SetAccessoryModeSettingL( aAccMode,
- aSetting );
- }
- break;
-
- case ETFGetIntAccessoryModeSetting:
- {
- TInt aSettingsValueInt;
-
- TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
- TAccModeSetting aSetting;
- aSetting.SetId( aParameter.iArg2 );
-
- retval = iAccessorySettings->GetAccessoryModeSetting( aAccMode,
- aSetting );
-
- if( aSetting.Type() == EAccModeSettingInt )
- {
- retval = aSetting.GetTInt( aSettingsValueInt );
-
- if( retval != KErrNotFound )
- {
- if( aSettingsValueInt == aParameter.iArg4 )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrArgument;
- }
- }
- }
- else
- {
- retval = KErrNotFound;
- }
- }
- break;
-
- case ETFGetBoolAccessoryModeSetting:
- {
- TBool aSettingsValueBool;
-
- TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
- TAccModeSetting aSetting;
- aSetting.SetId( aParameter.iArg2 );
-
- retval = iAccessorySettings->GetAccessoryModeSetting( aAccMode,
- aSetting );
-
- if( aSetting.Type() == EAccModeSettingBool )
- {
- retval = aSetting.GetTBool( aSettingsValueBool );
-
- if( retval != KErrNotFound )
- {
- if( aSettingsValueBool == ( TBool )aParameter.iArg4 )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrArgument;
- }
- }
- }
- else
- {
- retval = KErrNotFound;
- }
- }
- break;
-
- case ETFGetDesAccessoryModeSetting:
- {
- TBuf<KMaxAccModeSetting> aSettingsValueDes;
-
- TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
- TAccModeSetting aSetting;
- aSetting.SetId( aParameter.iArg2 );
-
- retval = iAccessorySettings->GetAccessoryModeSetting( aAccMode,
- aSetting );
-
- if( aSetting.Type() == EAccModeSettingDes )
- {
- retval = aSetting.GetTDes( aSettingsValueDes );
-
- if( retval != KErrNotFound )
- {
- TBuf<KMaxAccModeSetting> buffer;
- buffer.Num( aParameter.iArg3 );
- if( KErrNone == aSettingsValueDes.Compare( buffer ) )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrArgument;
- }
- }
- }
- else
- {
- retval = KErrNotFound;
- }
- }
- break;
-
- case ETFSetSeveralAccessoryModeSetting:
- {
-
- TAccModeSetting accModeSettingIn;
- TAccMode tAccMode = EAccModeWirelessHeadset;
- TBuf<KMaxAccModeSetting> aDesIn;
- // Set
- // setting 1
- accModeSettingIn.SetId( 11 ); // unknown TInt
- accModeSettingIn.SetTInt( 1 );
- TAccModeSettingArray arrayIn;
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 2
- accModeSettingIn.SetId( 12 ); // unknown Des
- _LIT( KAccSetting2, "012345678901234567890" );
- aDesIn.Copy( KAccSetting2 );
- accModeSettingIn.SetTDes( aDesIn );
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 3
- accModeSettingIn.SetId( 13 ); // unknown TBool
- accModeSettingIn.SetTBool( ETrue );
- arrayIn.AddSetting( accModeSettingIn );
-
- retval = iAccessorySettings->SetAccessoryModeSettingsL( tAccMode,
- arrayIn );
-
- }
- break;
-
- case ETFGetSeveralAccessoryModeSetting:
- {
-
- TAccModeSetting accModeSettingOut;
- TAccMode tAccMode = EAccModeWirelessHeadset;
- TBuf<KMaxAccModeSetting> aDesOut;
- TAccModeSettingArray arrayOut;
- TInt intOut( 0 );
- // set input parameters for GetAccessoryModeSettings()
- // setting 11
- accModeSettingOut.SetId( 11 );
- arrayOut.AddSetting( accModeSettingOut );
-
- // setting 12
- accModeSettingOut.SetId( 12 );
- arrayOut.AddSetting( accModeSettingOut );
-
- // setting 13
- accModeSettingOut.SetId( 13 );
- arrayOut.AddSetting( accModeSettingOut );
-
- retval = iAccessorySettings->GetAccessoryModeSettings( tAccMode,
- arrayOut );
-
- // Check that got settings are right
-
- TInt count = arrayOut.GetArraySize();
- TInt foundCount( 0 );
-
- for( TInt index = 0; index < count; index++ )
- {
- arrayOut.GetSetting( index, accModeSettingOut );
-
- if( 11 == accModeSettingOut.Id() )
- {
-
- accModeSettingOut.GetTInt( intOut );
-
- if( 1 == intOut )
- {
- foundCount++;
- }
- }
-
- if( 12 == accModeSettingOut.Id() )
- {
- accModeSettingOut.GetTDes( aDesOut );
-
- if( KErrNone == aDesOut.Compare( _L("012345678901234567890") ) )
- {
- foundCount++;
- }
-
- }
-
- if( 13 == accModeSettingOut.Id() )
- {
-
- accModeSettingOut.GetTBool( intOut );
-
- if( intOut )
- {
- foundCount++;
- }
- }
- }
-
- if( foundCount != 3 )
- {
- retval = KErrNotFound;
- }
-
- //
- // Reset Settings
- //
- TAccModeSetting accModeSettingIn;
- TBuf<KMaxAccModeSetting> aDesIn;
- // Set
- // setting 1
- accModeSettingIn.SetId( 11 ); // unknown TInt
- accModeSettingIn.SetTInt( 0 );
- TAccModeSettingArray arrayIn;
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 2
- accModeSettingIn.SetId( 12 ); // unknown Des
- _LIT( KAccSetting2, "" );
- aDesIn.Copy( KAccSetting2 );
- accModeSettingIn.SetTDes( aDesIn );
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 3
- accModeSettingIn.SetId( 13 ); // unknown TBool
- accModeSettingIn.SetTBool( EFalse );
- arrayIn.AddSetting( accModeSettingIn );
-
- iAccessorySettings->SetAccessoryModeSettingsL( tAccMode, arrayIn );
- }
- break;
-
- //
- // Accessory Single Connection
- //
- case ETFAccessorySingleConnection_Open:
- {
- if( iAccessorySingleConnection == NULL )
- {
- iAccessorySingleConnection
- = new ( ELeave ) RAccessorySingleConnection;
- retval
- = iAccessorySingleConnection->CreateSubSession( iAccessoryServer );
- }
- else
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessorySingleConnection_Close:
- {
- TRACE_ASSERT( iAccessorySingleConnection != NULL );
-
- if( iAccessorySingleConnection != NULL )
- {
- iAccessorySingleConnection->CloseSubSession();
- delete iAccessorySingleConnection;
- iAccessorySingleConnection = NULL;
- }
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryNotifyNewAccessoryConnected:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyNewAccessoryConnected( iGenericId[aParameter.iGid] );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryNotifyAccessoryDisconnected:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyAccessoryDisconnected( iGenericId[aParameter.iGid] );
- retval = KErrNone;
- }
- break;
-
- case ETFNotifyIntAccessoryValueChanged:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyIntegerAccessoryValueChanged( iGenericId[aParameter.iGid],
- aParameter.iArg3 );
- retval = KErrNone;
- }
- break;
-
- case ETFNotifyBoolAccessoryValueChanged:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyBooleanAccessoryValueChanged( iGenericId[aParameter.iGid],
- aParameter.iArg3 );
- retval = KErrNone;
- }
- break;
-
- case ETFNotifyObjectAccessoryValueChanged:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyObjectAccessoryValueChanged( iGenericId[aParameter.iGid],
- aParameter.iArg3 );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryIntGetValue:
- {
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TAccValueTypeTInt aIntValue;
-
- iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid],
- aNameRecord,
- aIntValue );
-
- if( aIntValue.iValue == aParameter.iArg2 )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrArgument;
- }
- }
- break;
-
- case ETFAccessoryBoolGetValue:
- {
- RAccessoryConnection accessoryConnection;
- accessoryConnection.CreateSubSession( iAccessoryServer );
-
- TAccPolNameRecord nameRecord;
- nameRecord.SetNameL( aParameter.iArg3 );
- TAccValueTypeTBool boolValue;
- retval
- = accessoryConnection.GetValueL( iGenericId[aParameter.iGid],
- nameRecord,
- boolValue );
-
- if( boolValue.iValue != aParameter.iArg1 )
- {
- retval = KErrArgument;
- }
-
- accessoryConnection.CloseSubSession();
- }
- break;
-
- case ETFAccessoryDes8GetValue:
- {
- TBuf8<80>
- worm( _L8("Malicious Worm Attach with extra long data with extra long content" ));
- TBuf8<85> valueBuf;
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg1 );
- TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, valueBuf ) );
-
- if( err == aParameter.iExpectedResult )
- {
-
- if( aParameter.iExpectedResult == KErrArgument )
- {
- retval = KErrNone;
- }
- else
- {
- if( KErrNone == valueBuf.Compare( worm ) )
- {
- RDebug::RawPrint( valueBuf );
- retval = KErrNone;
- }
- else
- {
- retval = KErrArgument;
- }
- }
- }
- else
- {
- retval = KErrArgument;
- }
- }
- break;
-
- case ETFAccessoryObjectParseTopology:
- {
-
- TInt rspeaker( KErrGeneral );
- TInt lspeaker( KErrGeneral );
- TInt rmic( KErrGeneral );
- TInt lmic( KErrGeneral );
- TInt mute( KErrGeneral );
- TInt sidetone( KErrGeneral );
- //
- // Find speaker volume object in USB headset case.
- //
- CAccPolAudioUnitBase* audioUnit = NULL;
- CAccPolAudioControlBase* audioControl = NULL;
- //CAccPolOutputTerminal* ouputTerminal = NULL;
-
- if( iTopologyContainer->OutputTerminalL( CAccPolOutputTerminal::EAPTHeadphone,
- audioUnit ) )
- {
- if( audioUnit->GetNextAudioUnitL( audioUnit ) )
- {
- if( audioUnit->ObjectType()
- == EAccPolAudioFeatureUnitObject )
- {
- if( audioUnit->GetAudioControlL( EAccPolAudioVolumeControlObject,
- KAccRightFrontChannel,
- audioControl ) )
- {
- iSpeakerRightVolume = CAccPolVolumeControl::NewL();
- *iSpeakerRightVolume
- = *reinterpret_cast<CAccPolVolumeControl*> ( audioControl );
- rspeaker = KErrNone;
- }
- if( audioUnit->GetAudioControlL( EAccPolAudioVolumeControlObject,
- KAccLeftFrontChannel,
- audioControl ) )
- {
- iSpeakerLeftVolume = CAccPolVolumeControl::NewL();
- *iSpeakerLeftVolume
- = *reinterpret_cast<CAccPolVolumeControl*> ( audioControl );
- lspeaker = KErrNone;
- }
- if( audioUnit->GetAudioControlL( EAccPolAudioMuteControlObject,
- KAccMasterChannel,
- audioControl ) )
- {
- iSpeakerMute = CAccPolMuteControl::NewL();
- *iSpeakerMute
- = *reinterpret_cast<CAccPolMuteControl*> ( audioControl );
- mute = KErrNone;
- }
-
- }
- }
- }
-
- //
- // Find mic volume object in USB headset case.
- //
- if( iTopologyContainer->OutputTerminalL( CAccPolOutputTerminal::EAPTStream,
- audioUnit ) )
- {
- do
- {
- }
- while( audioUnit->GetNextAudioUnitL( audioUnit )
- && audioUnit->ObjectType() != EAccPolAudioFeatureUnitObject );
-
- RPointerArray<CAccPolAudioControlBase> aAudioControls;
- audioUnit->GetAudioControlsL( KAccRightFrontChannel,
- aAudioControls );
-
- if( aAudioControls.Count() > 0 )
- {
- iMicRightVolume = CAccPolVolumeControl::NewL();
- *iMicRightVolume
- = *reinterpret_cast<CAccPolVolumeControl*> ( aAudioControls.operator[]( 0 ) );
- rmic = KErrNone;
- }
- aAudioControls.Reset();
-
- audioUnit->GetAudioControlsL( KAccLeftFrontChannel,
- aAudioControls );
-
- if( aAudioControls.Count() > 0 )
- {
- iMicLeftVolume = CAccPolVolumeControl::NewL();
- *iMicLeftVolume
- = *reinterpret_cast<CAccPolVolumeControl*> ( aAudioControls.operator[]( 0 ) );
- lmic = KErrNone;
- }
-
- //
- // Find sidetone volume object in USB headset case.
- //
- iTopologyContainer->OutputTerminalL( CAccPolOutputTerminal::EAPTHeadphone,
- audioUnit );
-
- do
- {
- audioUnit->GetNextAudioUnitL( audioUnit );
- }
- while( audioUnit->ObjectType() != EAccPolAudioMixerUnitObject );
-
- if( audioUnit->SourceIdCount() > 1 )
- {
- RPointerArray<CAccPolAudioUnitBase> aAudioUnits;
- audioUnit->GetAudioUnitListL( aAudioUnits );
-
- for( TInt i = 0; i < aAudioUnits.Count(); i++ )
- {
- if( aAudioUnits.operator[]( i )->ObjectType()
- == EAccPolAudioFeatureUnitObject )
- {
- audioUnit = aAudioUnits.operator[]( i );
- break;
- }
- }
- }
-
- aAudioControls.Reset();
- audioUnit->GetAudioControlsL( aAudioControls );
- if( aAudioControls.Count() == 2 )
- {
- sidetone = KErrNone;
- }
- }
-
- retval = ( rspeaker | lspeaker | rmic | lmic | mute | sidetone );
-
- }
- break;
-
- case ETFAccessoryGetStreamObjects:
- {
- if( iStreamContainer != NULL )
- {
- delete iStreamContainer;
- iStreamContainer = NULL;
- }
- iStreamContainer = CAccPolAudioStreamFormatCon::NewL();
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iStreamContainer ) );
-
- if( err == aParameter.iExpectedResult )
- {
- //externalize container to bufFromASY
- CBufFlat* bufFromASY =
- CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( bufFromASY );
- bufFromASY->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- RBufWriteStream wStrm;
- ( void )wStrm.Open( *bufFromASY );
- wStrm.PushL();
- iStreamContainer->ExternalizeL( wStrm );
- wStrm.CommitL();
- wStrm.Close();
- wStrm.Pop();
- TPtr8 ptrbufFromASY( bufFromASY->Ptr( 0 ) );
-
- //Read container from PubSub
- RProperty prop;
- RBufReadStream rStrm;
- CBufFlat* bufFromPubSub =
- CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( bufFromPubSub );
- bufFromPubSub->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- TPtr8 ptrBufFromPubSub( bufFromPubSub->Ptr( 0 ) );
- TInt ret = prop.Get( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- ptrBufFromPubSub );
-
- TInt k = sizeof( bufFromASY );
- TInt kk = sizeof( bufFromPubSub );
-
- bufFromASY->Compress();
- bufFromPubSub->Compress();
-
- k = sizeof( bufFromASY );
- kk = sizeof( bufFromPubSub );
-
- retval
- = ( 0
- == memcompare( reinterpret_cast<TUint8*> ( &ptrbufFromASY ),
- sizeof( bufFromASY ),
- reinterpret_cast<TUint8*> ( &ptrBufFromPubSub ),
- sizeof( bufFromASY ) ) ) ? KErrNone : KErrGeneral;
-
- CleanupStack::PopAndDestroy( bufFromPubSub );
- CleanupStack::PopAndDestroy( bufFromASY );
- }
- }
- break;
-
- case ETFAccessoryGetStreamObjectsFromPolicy:
- {
- if( iStreamContainer != NULL )
- {
- delete iStreamContainer;
- iStreamContainer = NULL;
- }
- iStreamContainer = CAccPolAudioStreamFormatCon::NewL();
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iStreamContainer ) );
-
- RPointerArray<CAccPolAudioStreamFormat> inputStreamObjects;
- RPointerArray<CAccPolAudioStreamFormat> outputStreamObjects;
-
- iStreamContainer->GetInputStreamFormatsL( inputStreamObjects );
- iStreamContainer->GetOutputStreamFormatsL( outputStreamObjects );
-
- CAccPolAudioStreamFormat* inputStream =
- inputStreamObjects.operator[]( 0 );
- CAccPolAudioStreamFormat* ouputStream =
- outputStreamObjects.operator[]( 0 );
-
- retval = err;
- }
- break;
-
- case ETFAccessorySetStreamObjects:
- {
- CAccPolAudioStreamFormatCon* setContainer = CAccPolAudioStreamFormatCon::NewLC();
-
- RPointerArray<CAccPolAudioStreamFormat> inputStreamObjects;
- RPointerArray<CAccPolAudioStreamFormat> outputStreamObjects;
-
- iStreamContainer->GetInputStreamFormatsL( inputStreamObjects );
- CAccPolAudioStreamFormat* inputStream = NULL;
- for(TInt i=0; i<inputStreamObjects.Count(); i++)
- {
- inputStream = inputStreamObjects.operator[]( i );
- if( inputStream->AudioFormat() == KUidFormatPCM16 &&
- inputStream->UnitId() == 0 &&
- inputStream->StreamType() == CAccPolAudioStreamFormat::EStereo &&
- inputStream->BitResolution() == CAccPolAudioStreamFormat::EBitsPerSample16 &&
- inputStream->SamFreq() == 200 )
- {
- setContainer->AddL( *inputStream );
- break;
- }
- }
-
- iStreamContainer->GetOutputStreamFormatsL( outputStreamObjects );
- CAccPolAudioStreamFormat* outputStream = NULL;
- for(TInt i=0; i<outputStreamObjects.Count(); i++)
- {
- outputStream = outputStreamObjects.operator[]( i );
- if( outputStream->AudioFormat() == KUidFormatPCM16 &&
- outputStream->UnitId() == 0 &&
- outputStream->StreamType() == CAccPolAudioStreamFormat::EMono &&
- outputStream->BitResolution() == CAccPolAudioStreamFormat::EBitsPerSample32 &&
- outputStream->SamFreq() == 200 )
- {
- setContainer->AddL( *outputStream );
- break;
- }
- }
-
- RBufWriteStream wStrm;
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- (void)wStrm.Open( *buf );
- wStrm.PushL();
- setContainer->ExternalizeL( wStrm );
- wStrm.Close();
- wStrm.Pop();
- TPtr8 ptr( buf->Ptr( 0 ) );
-
- retval = RProperty::Set( KTFAccessoryTestProperty, KTFAccessoryObjectMethod, ptr );
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
-
- TRAPD( setErr, iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, *setContainer ) );
-
- retval = setErr;
-
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( setContainer );
- inputStreamObjects.Close();
- outputStreamObjects.Close();
- }
- break;
-
- case ETFAccessoryGetTopologyObjects:
- {
- if( iTopologyContainer != NULL )
- {
- delete iTopologyContainer;
- iTopologyContainer = NULL;
- }
-
- iTopologyContainer = CAccPolAudioTopologyObjectCon::NewL();
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iTopologyContainer ) );
-
- if( err == aParameter.iExpectedResult )
- {
- //externalize container to bufFromASY
- CBufFlat* bufFromASY =
- CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( bufFromASY );
- bufFromASY->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- RBufWriteStream wStrm;
- ( void )wStrm.Open( *bufFromASY );
- wStrm.PushL();
- iTopologyContainer->ExternalizeL( wStrm );
- wStrm.CommitL();
- wStrm.Close();
- wStrm.Pop();
- TPtr8 ptrbufFromASY( bufFromASY->Ptr( 0 ) );
-
- //Read container from PubSub
- RProperty prop;
- RBufReadStream rStrm;
- CBufFlat* bufFromPubSub =
- CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( bufFromPubSub );
- bufFromPubSub->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- TPtr8 ptrBufFromPubSub( bufFromPubSub->Ptr( 0 ) );
- TInt ret = prop.Get( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- ptrBufFromPubSub );
-
- TInt k = sizeof( bufFromASY );
- TInt kk = sizeof( bufFromPubSub );
-
- bufFromASY->Compress();
- bufFromPubSub->Compress();
-
- k = sizeof( bufFromASY );
- kk = sizeof( bufFromPubSub );
-
- retval
- = ( 0
- == memcompare( reinterpret_cast<TUint8*> ( &ptrbufFromASY ),
- sizeof( bufFromASY ),
- reinterpret_cast<TUint8*> ( &ptrBufFromPubSub ),
- sizeof( bufFromASY ) ) ) ? KErrNone : KErrGeneral;
-
- CleanupStack::PopAndDestroy( bufFromPubSub );
- CleanupStack::PopAndDestroy( bufFromASY );
- }
- }
- break;
-
- case ETFAccessoryGetVolumeControlObjects:
- {
-
- if( iTopologyContainer != NULL )
- {
- delete iTopologyContainer;
- iTopologyContainer = NULL;
- }
-
- iTopologyContainer = CAccPolAudioTopologyObjectCon::NewL();
-
- iTopologyContainer->AddL( *iSpeakerRightVolume );
- iTopologyContainer->AddL( *iSpeakerLeftVolume );
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iTopologyContainer ) );
-
- CAccPolVolumeControl* rightVolume;
- rightVolume = ( CAccPolVolumeControl* )iTopologyContainer->AtL( 0 );
-
- CAccPolVolumeControl* leftVolume;
- leftVolume = ( CAccPolVolumeControl* )iTopologyContainer->AtL( 1 );
-
- if( err == aParameter.iExpectedResult )
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessorySetVolumeControlObjects:
- {
- RBufWriteStream wStrm;
- CAccPolAudioTopologyObjectCon* setContainer =
- CAccPolAudioTopologyObjectCon::NewLC();
-
- iSpeakerRightVolume->SetVolumeDb( aParameter.iArg1 );
- iSpeakerRightVolume->SetMinVolumeDb( aParameter.iArg2 );
- iSpeakerRightVolume->SetMaxVolumeDb( aParameter.iArg4 );
- iSpeakerRightVolume->SetVolumeResDb( 0x05 );
- setContainer->AddL( *iSpeakerRightVolume );
- iSpeakerLeftVolume->SetVolumeDb( aParameter.iArg1 );
- iSpeakerLeftVolume->SetMinVolumeDb( aParameter.iArg2 );
- iSpeakerLeftVolume->SetMaxVolumeDb( aParameter.iArg4 );
- iSpeakerLeftVolume->SetVolumeResDb( 0x05 );
- setContainer->AddL( *iSpeakerLeftVolume );
-
- CBufFlat* buf =
- CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- ( void )wStrm.Open( *buf );
- wStrm.PushL();
- setContainer->ExternalizeL( wStrm );
- wStrm.Close();
- wStrm.Pop();
- TPtr8 ptr( buf->Ptr( 0 ) );
-
- retval = RProperty::Set( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- ptr );
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TRAPD( setErr, iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, *setContainer ) );
-
- retval = setErr;
-
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( setContainer );
- }
- break;
-
- case ETFAccessoryGetMuteControlObjects:
- {
-
- if( iTopologyContainer != NULL )
- {
- delete iTopologyContainer;
- iTopologyContainer = NULL;
- }
-
- iTopologyContainer = CAccPolAudioTopologyObjectCon::NewL();
-
- iTopologyContainer->AddL( *iSpeakerMute );
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iTopologyContainer ) );
-
- CAccPolMuteControl* mute;
- mute = ( CAccPolMuteControl* )iTopologyContainer->AtL( 0 );
-
- if( err == aParameter.iExpectedResult )
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessorySetMuteControlObjects:
- {
- RBufWriteStream wStrm;
- CAccPolAudioTopologyObjectCon* setContainer =
- CAccPolAudioTopologyObjectCon::NewLC();
-
- iSpeakerMute->SetMute( aParameter.iArg1 );
- setContainer->AddL( *iSpeakerMute );
-
- CBufFlat* buf =
- CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- ( void )wStrm.Open( *buf );
- wStrm.PushL();
- setContainer->ExternalizeL( wStrm );
- wStrm.Close();
- wStrm.Pop();
- TPtr8 ptr( buf->Ptr( 0 ) );
-
- retval = RProperty::Set( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- ptr );
-
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TRAPD( setErr, iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, *setContainer ) );
-
- retval = setErr;
-
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( setContainer );
- }
- break;
-
- //
- // Accessory Control
- //
-
- case ETFAccessoryControl_Open:
- {
- if( iAccessoryControl == NULL )
- {
- iAccessoryControl = new ( ELeave ) RAccessoryControl;
- retval = iAccessoryControl->CreateSubSession( iAccessoryServer );
- }
- else
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessoryControl_Close:
- {
- TRACE_ASSERT( iAccessoryControl != NULL );
-
- if( iAccessoryControl != NULL )
- {
- iAccessoryControl->CloseSubSession();
- delete iAccessoryControl;
- iAccessoryControl = NULL;
- }
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryNotifyAccessoryConnectionStatusChanged:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyAccessoryConnectionStatusChanged( iGenericIdArray );
- retval = KErrNone;
- }
- break;
-
- case ETFSyncGetAccessoryConnectionStatus:
- {
- iAccessoryConnection->GetAccessoryConnectionStatus( iGenericIdArray );
-
- if( iGenericIdArray.Count() != aParameter.iArg1 )
- {
- retval = KErrArgument;
- }
- else
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFASyncGetAccessoryConnectionStatus:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->GetAccessoryConnectionStatus( iGenericIdArray );
- retval = KErrNone;
- }
- break;
-
- case ETFSetIntValue:
- {
- SetIntValue(aParameter, &retval);
- }
- break;
-
- case ETFSetBoolValue:
- {
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TAccValueTypeTBool aBoolValue;
- aBoolValue.iValue = aParameter.iArg1;
- retval = iAccessoryControl->SetValueL( iGenericId[aParameter.iGid],
- aNameRecord,
- aBoolValue );
- }
- break;
-
- //
- //Tuupaa
- //
- case ETFAccessoryValueChangedNotifyInt:
- {
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( KAccAudioOutputType );
- TAccValueTypeTInt aIntValue;
- aIntValue.iValue = EAccAudioOutPutTypePublic;
- iAccessoryControl->AccessoryValueChangedNotifyL( iGenericId[aParameter.iGid],
- aNameRecord,
- aIntValue );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryValueChangedNotifyBool:
- {
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TAccValueTypeTBool aBoolValue;
- aBoolValue.iValue = ETrue;
- iAccessoryControl->AccessoryValueChangedNotifyL( iGenericId[aParameter.iGid],
- aNameRecord,
- aBoolValue );
- retval = KErrNone;
- }
- break;
-
- //
- // BT Control
- //
- case ETFBTAccessoryValueChangedNotifyBool:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- TAccPolNameRecord nameRecord;
- nameRecord.SetNameL( aParameter.iArg3 );
- TAccValueTypeTBool boolValue;
- boolValue.iValue = aParameter.iArg4;
- iAccessoryBTControl->AccessoryValueChangedNotifyL( btaddr,
- nameRecord,
- boolValue );
- retval = KErrNone;
- }
- break;
-
- case ETFBTAccessoryValueChangedNotifyInt:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- TAccPolNameRecord nameRecord;
- nameRecord.SetNameL( aParameter.iArg3 );
- TAccValueTypeTInt intValue;
- intValue.iValue = aParameter.iArg4;
- iAccessoryBTControl->AccessoryValueChangedNotifyL( btaddr,
- nameRecord,
- intValue );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryBtControl_Open:
- {
- if( iAccessoryBTControl == NULL )
- {
- iAccessoryBTControl = new ( ELeave ) RAccessoryBTControl;
- retval
- = iAccessoryBTControl->CreateSubSession( iAccessoryServer );
- }
- else
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessoryBtControl_Close:
- {
- TRACE_ASSERT( iAccessoryBTControl != NULL );
-
- if( iAccessoryBTControl != NULL )
- {
- iAccessoryBTControl->CloseSubSession();
- delete iAccessoryBTControl;
- iAccessoryBTControl = NULL;
- }
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryBtConnectAccessory:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->ConnectBTAccessory( btaddr );
- retval = KErrNone;
- }
- break;
- case ETFAccessoryBtDisconnectAccessory:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- TRequestStatus status;
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->DisconnectBTAccessory( btaddr );
- retval = KErrNone;
- TAccPolGenericID emptyInstance;
- iGenericId[aParameter.iGid] = emptyInstance;
- }
- break;
-
- case ETFAccessoryNotifyBluetoothAudioLinkOpenReq:
- {
- //TRequestStatus status;
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyBluetoothAudioLinkOpenReq();
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryBluetoothAudioLinkOpenedNotify:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkOpenedNotifyL( btaddr, (TAccAudioType)aParameter.iArg3 ) );
-
- if( err == aParameter.iExpectedResult )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrGeneral;
- }
- }
- break;
-
- case ETFAccessoryBluetoothAudioLinkOpenResp:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- TInt response( aParameter.iArg2 );
- TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkOpenRespL( btaddr, response ) );
-
- if( err == aParameter.iExpectedResult )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrGeneral;
- }
- }
- break;
-
- case ETFAccessoryNotifyBluetoothAudioLinkCloseReq:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyBluetoothAudioLinkCloseReq();
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryBluetoothAudioLinkClosedNotify:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkClosedNotifyL( btaddr, ( TAccAudioType )aParameter.iArg3 ) );
-
- if( err == aParameter.iExpectedResult )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrGeneral;
- }
- }
- break;
-
- case ETFAccessoryBluetoothAudioLinkCloseResp:
- {
- TBTDevAddr btaddr( aParameter.iArg1 );
- TInt response( aParameter.iArg2 );
- TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkCloseRespL( btaddr, response ) );
-
- if( err == aParameter.iExpectedResult )
- {
- retval = KErrNone;
- }
- else
- {
- retval = KErrGeneral;
- }
- }
- break;
-
- case ETFAccessoryBtCancelConnectAccessory:
- {
- TRequestStatus status;
- TBTDevAddr btaddr( aParameter.iArg1 );
- iAccessoryBTControl->ConnectAccessory( status, btaddr );
- iAccessoryBTControl->CancelConnectAccessory();
- User::WaitForRequest( status );
- if( KErrCancel != status.Int() )
- {
- retval = status.Int();
- }
- else
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessoryBtCancelDisconnectAccessory:
- {
- TRequestStatus status;
- TBTDevAddr btaddr( aParameter.iArg1 );
- iAccessoryBTControl->DisconnectAccessory( status, btaddr );
- iAccessoryBTControl->CancelDisconnectAccessory();
- User::WaitForRequest( status );
- retval = status.Int();
- }
- break;
-
- //
- // Accessory Mode
- //
- case ETFAccessoryMode_Open:
- {
- if( iAccessoryMode == NULL )
- {
- iAccessoryMode = new ( ELeave ) RAccessoryMode;
- retval = iAccessoryMode->CreateSubSession( iAccessoryServer );
- }
- else
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessoryMode_Close:
- {
- TRACE_ASSERT( iAccessoryMode != NULL );
-
- if( iAccessoryMode != NULL )
- {
- iAccessoryMode->CloseSubSession();
- delete iAccessoryMode;
- iAccessoryMode = NULL;
- }
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryNotifyAccessoryModeChanged:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyAccessoryModeChanged();
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryAccessoryModeSync:
- {
- TAccPolAccessoryMode mode;
- retval = iAccessoryMode->GetAccessoryMode( mode );
-
- if( retval == KErrNone )
- {
- if( aParameter.iArg1 != mode.iAccessoryMode )
- {
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Unexpected Accessory Mode Parameter1 %d %d" ), aParameter.iArg1, mode.iAccessoryMode ) );
- retval = KTFErrAccessoryUnexpectedArg1;
- }
-#ifdef __WINS__ // Just check this in winscw
- if( aParameter.iArg2 != mode.iAudioOutputStatus )
- {
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Unexpected Accessory Mode Parameter2 %d %d" ), aParameter.iArg2, mode.iAudioOutputStatus ) );
- retval = KTFErrAccessoryUnexpectedArg2;
- }
-#endif
- }
- else
- {
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Getting Accessory Mode Failed %d" ), retval ) );
- }
-
- }
- break;
-
- case ETFAccessoryAccessoryModeASync:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->GetAccessoryMode();
- retval = KErrNone;
- }
- break;
-
- //
- // Audio Control
- //
- case ETFAccessoryAudioControl_Open:
- {
- if( iAccessoryAudioControl == NULL )
- {
- iAccessoryAudioControl = new ( ELeave ) RAccessoryAudioControl;
- retval
- = iAccessoryAudioControl->CreateSubSession( iAccessoryServer );
- }
- else
- {
- retval = KErrNone;
- }
- }
- break;
-
- case ETFAccessoryAudioControl_Close:
- {
- TRACE_ASSERT( iAccessoryAudioControl != NULL );
-
- if( iAccessoryAudioControl != NULL )
- {
- iAccessoryAudioControl->CloseSubSession();
- delete iAccessoryAudioControl;
- iAccessoryAudioControl = NULL;
- }
- retval = KErrNone;
- }
- break;
-
- case ETFAudioRoutingStatusNotify:
- {
- RAccessoryAudioControl audioControl;
- audioControl.CreateSubSession( iAccessoryServer );
-
- audioControl.AudioRoutingStatusNotify( aParameter.iArg1,
- iGenericId[aParameter.iGid] );
- retval = KErrNone;
-
- audioControl.CloseSubSession();
- }
- break;
-
- case ETFAccessoryAudioLinkOpen:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->AccessoryAudioLinkOpen( iGenericId[aParameter.iGid],
- aParameter.iArg3 );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryNotifyAccessoryAudioLinkOpened:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyAccessoryAudioLinkOpened( iGenericId[aParameter.iGid] );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryNotifyAccessoryAudioLinkClosed:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->NotifyAccessoryAudioLinkClosed( iGenericId[aParameter.iGid] );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryAccessoryAudioLinkClose:
- {
- CTFTestControlObserver* aConnectionObserver = CreateObserver();
- TRACE_ASSERT( aConnectionObserver != NULL );
- aConnectionObserver->AccessoryAudioLinkClose( iGenericId[aParameter.iGid],
- aParameter.iArg3 );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessoryPublishAndSubscribe:
- {
- PublishAndSubscribeL( aParameter );
- retval = KErrNone;
- }
- break;
-
- case ETFAccessory_Cancel:
- {
- CTFTestControlObserver* item;
- if( !iStack.IsEmpty() )
- {
- item = iStack.First();
- item->Cancel();
- }
- retval = KErrNone;
- }
- break;
-
- //
- // Cancels
- //
- case ETFCancelAccessoryAudioLinkOpen:
- {
- iAccessoryAudioControl->CancelAccessoryAudioLinkOpen();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelAccessoryAudioLinkClose:
- {
- iAccessoryAudioControl->CancelAccessoryAudioLinkClose();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyAccessoryAudioLinkOpened:
- {
- iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkOpened();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyAccessoryAudioLinkClosed:
- {
- iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkClosed();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyProcessCommand:
- {
- TRACE_ASSERT_ALWAYS;
- }
- break;
-
- case ETFCancelConnectAccessory:
- {
- iAccessoryControl->CancelConnectAccessory();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelDisconnectAccessory:
- {
- iAccessoryControl->CancelDisconnectAccessory();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyBluetoothAudioLinkOpenReq:
- {
- iAccessoryBTControl->CancelNotifyBluetoothAudioLinkOpenReq();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyBluetoothAudioLinkCloseReq:
- {
- iAccessoryBTControl->CancelNotifyBluetoothAudioLinkCloseReq();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyAccessoryConnectionStatusChanged:
- {
- iAccessoryConnection->CancelNotifyAccessoryConnectionStatusChanged();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelGetAccessoryConnectionStatus:
- {
- iAccessoryConnection->CancelGetAccessoryConnectionStatus();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelConnectAccessoryBT:
- {
- iAccessoryBTControl->CancelConnectAccessory();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelDisconnectAccessoryBT:
- {
- iAccessoryBTControl->CancelDisconnectAccessory();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyAccessoryModeChanged:
- {
- iAccessoryMode->CancelNotifyAccessoryModeChanged();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelGetAccessoryMode:
- {
- iAccessoryMode->CancelGetAccessoryMode();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyNewAccessoryConnected:
- {
- iAccessorySingleConnection->CancelNotifyNewAccessoryConnected();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyAccessoryDisconnected:
- {
- iAccessorySingleConnection->CancelNotifyAccessoryDisconnected();
- retval = KErrNone;
- }
- break;
-
- case ETFCancelNotifyAccessoryValueChanged:
- {
- TAccPolNameRecord nameRecord;
- nameRecord.SetNameL( aParameter.iArg3 );
- iAccessorySingleConnection->CancelNotifyAccessoryValueChanged( nameRecord );
- retval = KErrNone;
- }
- break;
-
- case ETFSelectionDialogText:
- {
- SelectionDialog(ETFSelectionDialogText, &retval);
- }
- break;
-
- case ETFSelectionDialogCancel:
- {
- SelectionDialog(ETFSelectionDialogCancel, &retval);
- }
- break;
-
- case ETFNotSupportedNote:
- {
- TUid KAccFwUiNoteNotifierUid =
- {
- 0x10205061
- };
- RNotifier notifier;
- notifier.Connect();
-
- TInt err = notifier.StartNotifier( KAccFwUiNoteNotifierUid,
- KNullDesC8 );
-
- TInt value( 0 );
- TPckg<TInt> intPckg( value );
- notifier.Close();
-
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- value = 1;
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- value = value << 1;
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- value = value << 1;
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- value = value << 1;
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- value = value << 1;
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- value = value << 1;
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- value = value << 1;
- notifier.Connect();
- err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
- notifier.Close();
-
- retval = KErrNone;
- }
- break;
-
- case ETFValueRecordTests:
- {
- retval = TestValueRecordL();
- }
- break;
-
- case ETFObjectBaseSerializationTests:
- {
- retval = TestBaseSerializationL();
- }
- break;
-
- case ETFCheckConnectedAccessory:
- {
- CheckConnectedAccessory(&retval);
- }
- break;
-
- case ETFCallTClassMethods:
- {
- CallTClassMethods(&retval); \
- }
-
- case ETFSetHdmiObject_PubSub:
- {
- CreateHdmiObjectsToPubSubL( aParameter );
- retval = KErrNone;
- break;
- }
-
- case ETFGetHdmiObject:
- {
- TInt err = KErrNone;
- TAccPolNameRecord nameRecord;
- nameRecord.SetNameL( aParameter.iArg3 );
-
- // Create HDMI container
- CAccPolHdmiObjectCon* conFromASY = CAccPolHdmiObjectCon::NewLC();
- CAccPolHdmiObjectCon* conFromPS = CAccPolHdmiObjectCon::NewLC();
-
- // Get HDMI container
- TRAP( err, iAccessorySingleConnection->GetValueL(
- iGenericId[aParameter.iGid], nameRecord, *conFromASY ) );
-
- // Get HDMI container from P&S
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- TPtr8 bufPtr( buf->Ptr( 0 ) );
- err = RProperty::Get( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- bufPtr );
- if( err == KErrNone )
- {
- RBufReadStream readStream( *buf );
- readStream.PushL();
- conFromPS->InternalizeL( readStream );
- CleanupStack::PopAndDestroy( &readStream );
- }
- switch( aParameter.iArg3 )
- {
- case KAccVideoHdmiAttributes:
- {
- // Validate object count
- if( conFromASY->Count() != conFromPS->Count() )
- {
- err = KErrArgument;
- }
-
- // Validate speaker allocation
- RAccPolHdmiSpeakerAllocationArray array;
- CleanupClosePushL( array );
- conFromASY->GetHdmiSpeakerAllocationObjectsL( array );
- if( array.Count() )
- {
- CAccPolHdmiSpeakerAllocation* speakerAllocation = array[0];
- TUint32 bits = speakerAllocation->SpeakerAllocation();
-
- // Speaker allocation should be EHdmiSpeakerUnknown
- if( bits != CAccPolHdmiSpeakerAllocation::EHdmiSpeakerUnknown )
- {
- err = KErrArgument;
- }
-
- // Speaker count should be zero
- if( speakerAllocation->SpeakerCount() )
- {
- err = KErrArgument;
- }
- }
- CleanupStack::PopAndDestroy( &array );
- break;
- }
- case KAccVideoFormat:
- {
- // Validate object count
- if( conFromASY->Count() != conFromPS->Count() )
- {
- err = KErrArgument;
- }
-
- // Validate video format
- RAccPolHdmiVideoFormatArray array;
- CleanupClosePushL( array );
- conFromASY->GetHdmiVideoFormatObjectsL( array );
- if( array.Count() )
- {
- CAccPolHdmiVideoFormat* videoFormat = array[0];
-
- // Interlaced video should be enabled
- if( !videoFormat->Interlaced() )
- {
- err = KErrArgument;
- }
- }
- else
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( &array );
- break;
- }
- default:
- {
- break;
- }
- }
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( conFromPS );
- CleanupStack::PopAndDestroy( conFromASY );
- retval = err;
- break;
- }
-
- case ETFCheckHdmiObject:
- {
- TInt err = KErrNone;
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Check HDMI object %d" ),
- aParameter.iArg1 ) );
- switch( aParameter.iArg1 )
- {
- case EAccPolHdmiObjectCon:
- {
- err = CheckHdmiContainerObjectL();
- break;
- }
- case EAccPolHdmiSinkObject:
- {
- err = CheckHdmiSinkObjectL();
- break;
- }
- case EAccPolHdmiAudioFormatObject:
- {
- err = CheckHdmiAudioFormatObjectL();
- break;
- }
- case EAccPolHdmiLatencyObject:
- {
- err = CheckHdmiLatencyObjectL();
- break;
- }
- case EAccPolHdmiSpeakerAllocationObject:
- {
- err = CheckHdmiSpeakerAllocationObjectL();
- break;
- }
- case EAccPolHdmiVideoFormatObject:
- {
- err = CheckHdmiVideoFormatObjectL();
- break;
- }
- default:
- {
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Invalid HDMI object=%d" ),
- aParameter.iArg1 ) );
- err = KErrArgument;
- break;
- }
- }
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Check HDMI object %d returned with code %d" ),
- aParameter.iArg1, err ) );
- retval = err;
- break;
- }
-
- default:
- TRACE_ASSERT_ALWAYS;
- break;
-
- }
- User::LeaveIfError( retval );
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::TestValueRecordL()
-// ----------------------------------------------------------------------------------
-//
-TInt CTFAccessoryTestControl::TestValueRecordL()
- {
- TInt ret( KErrNone );
-
- TAccPolValueRecord valueRecord;
- TBuf8<KAccMaxECIBlockLength> eci;
- TBuf8<KAccMaxECIBlockLength> check;
- _LIT( Kissa, "Kissa" );
- eci.Copy( Kissa );
-
- valueRecord.SetValue( eci );
- check.Copy( valueRecord.ValueRef() );
-
- if( KErrNone != eci.Compare( check ) )
- {
- User::Leave( KErrGeneral );
- }
-
- TDesC8& test( valueRecord.ValueRef() );
- if( KErrNone != eci.Compare( test ) )
- {
- User::Leave( KErrGeneral );
- }
-
- return ret;
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::TestBaseSerializationL()
-// ----------------------------------------------------------------------------------
-//
-TInt CTFAccessoryTestControl::TestBaseSerializationL()
- {
- TInt ret( KErrNone );
- TInt err( KErrNone );
-
- /*** One container *************************************************************/
- CAccPolAudioStreamFormatCon* container1 =
- CAccPolAudioStreamFormatCon::NewLC();
- CAccPolAudioStreamFormatCon* container2 =
- CAccPolAudioStreamFormatCon::NewLC();
-
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- //Externalize to buf
- RBufWriteStream wStrm;
- ( void )wStrm.Open( *buf );
- wStrm.PushL();
- container1->ExternalizeL( wStrm );
- wStrm.CommitL();
- wStrm.Close();
- wStrm.Pop();
-
- //Internalize from buf
- RBufReadStream rStrm;
- ( void )rStrm.Open( *buf );
- rStrm.PushL();
- container2->InternalizeL( rStrm );
- rStrm.Close();
- rStrm.Pop();
-
- //container1 content must equal to container2 content
- err = ( 0 == memcompare( reinterpret_cast<TUint8*> ( container1 ),
- sizeof(CAccPolObjectCon),
- reinterpret_cast<TUint8*> ( container2 ),
- sizeof(CAccPolObjectCon) ) ) ? KErrNone : KErrGeneral;
- User::LeaveIfError( err );
-
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( container2 );
- CleanupStack::PopAndDestroy( container1 );
- container2 = NULL;
- container1 = NULL;
- /* end *************************************************************************/
-
- //Make test again!
-
- CAccPolAudioStreamFormat* audioStream1 =
- CAccPolAudioStreamFormat::NewLC( EAccPolAudioInputStreamObject,
- 15,
- KUidFormatMP3,
- CAccPolAudioStreamFormat::EStereo,
- CAccPolAudioStreamFormat::EBitsPerSample24,
- 11 );
-
- buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- //Externalize to buf
- ( void )wStrm.Open( *buf );
- wStrm.PushL();
- audioStream1->ExternalizeL( wStrm );
- wStrm.CommitL();
- wStrm.Close();
- wStrm.Pop();
-
- //Internalize from buf
- ( void )rStrm.Open( *buf );
- rStrm.PushL();
-
- TInt objectid = rStrm.ReadUint8L();
-
- if( ( TStreamConObjectType )objectid == EAccPolAudioInputStreamObject )
- {
- CAccPolAudioStreamFormat* audioStream2 =
- CAccPolAudioStreamFormat::NewLC( EAccPolAudioInputStreamObject );
-
- audioStream2->InternalizeL( rStrm );
-
- //audioStream1 content must equal to audioStream2 content
- err = ( 0 == memcompare( reinterpret_cast<TUint8*> ( audioStream1 ),
- sizeof(CAccPolAudioStreamFormat),
- reinterpret_cast<TUint8*> ( audioStream2 ),
- sizeof(CAccPolAudioStreamFormat) ) ) ? KErrNone : KErrGeneral;
-
- User::LeaveIfError( err );
-
- CleanupStack::PopAndDestroy( audioStream2 );
-
- rStrm.Close();
- rStrm.Pop();
-
- }
- else
- {
- User::LeaveIfError( KErrGeneral );
- }
-
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( audioStream1 );
- audioStream1 = NULL;
- /* end *************************************************************************/
-
- return ret;
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::PublishAndSubscribeL()
-// ----------------------------------------------------------------------------------
-//
-void CTFAccessoryTestControl::PublishAndSubscribeL( TTFAccessoryTestCaseStateControl& aParameter )
- {
- TPckgBuf<TTFAccessoryPublishAndSubscribe> buf;
-
- buf().iTestCaseID = aParameter.iTestCaseID;
- buf().iMethod = aParameter.iMethod;
- buf().iParam1 = aParameter.iArg1;
- buf().iTimeMs = aParameter.iArg4;
- buf().iGenericID = iGenericId[aParameter.iGid];
-
- // Send capability to stub(s).
-
- // if( aParameter.iArg3 )
- // {
- buf().iParam2 = aParameter.iArg3;
- // }
-
- /*
- if( aParameter.iArg3->Compare( KNullDesC ) )
- {
- buf().iParam2.Copy( *aParameter.iArg3 );
- }
-
- */
- User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty,
- KTFAccessoryMethod,
- buf ) );
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CreateHdmiObjectsToPubSubL()
-// ----------------------------------------------------------------------------------
-//
-void CTFAccessoryTestControl::CreateHdmiObjectsToPubSubL(
- TTFAccessoryTestCaseStateControl& aParameter )
- {
- // Define property just in case
- RProperty::Define( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- RProperty::EByteArray );
-
- // Create HDMI container
- CAccPolHdmiObjectCon* con = CAccPolHdmiObjectCon::NewLC();
- switch( aParameter.iArg3 )
- {
- case KAccVideoHdmiAttributes:
- {
- // Create audio format object
- CreateHdmiObjectL( *con, EAccPolHdmiAudioFormatObject );
-
- // Create latency object
- CreateHdmiObjectL( *con, EAccPolHdmiLatencyObject );
-
- // Create sink object
- CreateHdmiObjectL( *con, EAccPolHdmiSinkObject );
-
- // Create speaker allocation object
- CreateHdmiObjectL( *con, EAccPolHdmiSpeakerAllocationObject );
-
- // Create video format object
- CreateHdmiObjectL( *con, EAccPolHdmiVideoFormatObject );
- break;
- }
- case KAccVideoFormat:
- {
- // Create video format object
- CreateHdmiObjectL( *con, EAccPolHdmiVideoFormatObject );
- break;
- }
- default:
- {
- break;
- }
- }
- // Stream HDMI container to P&S
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- RBufWriteStream writeStream( *buf );
- writeStream.PushL();
- con->ExternalizeL( writeStream );
- writeStream.CommitL();
- CleanupStack::PopAndDestroy( &writeStream );
-
- TPtr8 bufPtr( buf->Ptr( 0 ) );
- TInt err = RProperty::Set( KTFAccessoryTestProperty,
- KTFAccessoryObjectMethod,
- bufPtr );
- User::LeaveIfError( err );
-
- // Check if ASY stub needs to be informed
- if( aParameter.iArg2 )
- {
- PublishAndSubscribeL( aParameter );
- }
-
- // Cleanup
- CleanupStack::PopAndDestroy( buf );
- CleanupStack::PopAndDestroy( con );
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CheckHdmiContainerObjectL
-// ----------------------------------------------------------------------------------
-TInt CTFAccessoryTestControl::CheckHdmiContainerObjectL()
- {
- TInt err = KErrNone;
- CAccPolHdmiObjectCon* con1 = NULL;
- CAccPolHdmiObjectCon* con2 = NULL;
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- // NewL
- con1 = CAccPolHdmiObjectCon::NewL();
- CleanupStack::PushL( con1 );
- CleanupStack::PopAndDestroy( con1 );
-
- // NewLC
- con1 = CAccPolHdmiObjectCon::NewLC();
- CleanupStack::PopAndDestroy( con1 );
-
- // Internalize & Externalize
- con1 = CAccPolHdmiObjectCon::NewLC();
- CreateHdmiObjectL( *con1, EAccPolHdmiAudioFormatObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiLatencyObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiSinkObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiSpeakerAllocationObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiVideoFormatObject );
- RBufWriteStream writeStream;
- writeStream.Open( *buf );
- writeStream.PushL();
- con1->ExternalizeL( writeStream );
- writeStream.CommitL();
- CleanupStack::PopAndDestroy( &writeStream );
-
- con2 = CAccPolHdmiObjectCon::NewLC();
- RBufReadStream readStream;
- readStream.Open( *buf );
- readStream.PushL();
- con2->InternalizeL( readStream );
- if( con1->Count() == con2->Count() )
- {
- TInt count = con1->Count();
- CAccPolObjectBase* objBase1 = NULL;
- CAccPolObjectBase* objBase2 = NULL;
- for( TInt i = 0; i < count; i++ )
- {
- objBase1 = con1->AtL( i );
- objBase2 = con2->AtL( i );
- if( objBase1->ObjectType() != objBase2->ObjectType() )
- {
- err = KErrArgument;
- }
- }
- }
- else
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( &readStream );
- CleanupStack::PopAndDestroy( con2 );
- CleanupStack::PopAndDestroy( con1 );
-
- // DuplicateLC
- con1 = CAccPolHdmiObjectCon::NewLC();
- CreateHdmiObjectL( *con1, EAccPolHdmiAudioFormatObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiLatencyObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiSinkObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiSpeakerAllocationObject );
- CreateHdmiObjectL( *con1, EAccPolHdmiVideoFormatObject );
- con2 = static_cast<CAccPolHdmiObjectCon*>( con1->DuplicateLC() );
- if( con1->Count() == con2->Count() )
- {
- TInt count = con1->Count();
- CAccPolObjectBase* objBase1 = NULL;
- CAccPolObjectBase* objBase2 = NULL;
- for( TInt i = 0; i < count; i++ )
- {
- objBase1 = con1->AtL( i );
- objBase2 = con2->AtL( i );
- if( objBase1->ObjectType() != objBase2->ObjectType() )
- {
- err = KErrArgument;
- }
- }
- }
- else
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( con2 );
- CleanupStack::PopAndDestroy( con1 );
-
- // Rest of the API
- con1 = CAccPolHdmiObjectCon::NewLC();
- THdmiConObjectType objectType = EAccPolHdmiObjectCon;
- TBool exit = EFalse;
- TInt index = 0;
- TInt count = 0;
- do
- {
- index++;
- err = KErrArgument;
- objectType = ( THdmiConObjectType )( index );
- CreateHdmiObjectL( *con1, objectType );
- count = con1->Count();
- CAccPolObjectBase* obj = NULL;
- if( con1->Count() != index )
- {
- err = KErrArgument;
- break;
- }
- for( TInt ii = 0; ii < count; ii++ )
- {
- obj = con1->AtL( ii );
- if( obj->ObjectType() == objectType )
- {
- err = KErrNone;
- break;
- }
- }
- if( objectType == EAccPolHdmiVideoFormatObject )
- {
- // Last object
- exit = ETrue;
- }
- }
- while( !exit && ( err == KErrNone ) );
- CleanupStack::PopAndDestroy( con1 );
- CleanupStack::PopAndDestroy( buf );
-
- return err;
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CheckHdmiSinkObjectL
-// ----------------------------------------------------------------------------------
-TInt CTFAccessoryTestControl::CheckHdmiSinkObjectL()
- {
- TInt err = KErrNone;
- CAccPolHdmiSink* obj = NULL;
- CAccPolHdmiSink* objDuplicate = NULL;
- TUint8 objectType = 0;
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- // NewL
- obj = CAccPolHdmiSink::NewL();
- CleanupStack::PushL( obj );
- CleanupStack::PopAndDestroy( obj );
-
- // NewL - with params
- obj = CAccPolHdmiSink::NewL( ETrue, ETrue );
- CleanupStack::PushL( obj );
- if( !obj->BasicAudioSupport() )
- {
- err = KErrArgument;
- }
- if( !obj->HdcpSupport() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC
- obj = CAccPolHdmiSink::NewLC();
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC - with params
- obj = CAccPolHdmiSink::NewLC( ETrue, ETrue );
- if( !obj->BasicAudioSupport() )
- {
- err = KErrArgument;
- }
- if( !obj->HdcpSupport() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // Internalize & Externalize
- obj = CAccPolHdmiSink::NewLC( ETrue, ETrue );
-
- RBufWriteStream writeStream;
- writeStream.Open( *buf );
- writeStream.PushL();
- obj->ExternalizeL( writeStream );
- writeStream.CommitL();
- CleanupStack::PopAndDestroy( &writeStream );
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiSink::NewLC();
- RBufReadStream readStream;
- readStream.Open( *buf );
- readStream.PushL();
- objectType = readStream.ReadUint8L();
- obj->InternalizeL( readStream );
- if( objectType != EAccPolHdmiSinkObject )
- {
- err = KErrArgument;
- }
- if( !obj->BasicAudioSupport() )
- {
- err = KErrArgument;
- }
- if( !obj->HdcpSupport() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( &readStream );
- CleanupStack::PopAndDestroy( obj );
-
- // DuplicateLC - mem compare can be used since the object does not contain
- // any ponters as memebers
- obj = CAccPolHdmiSink::NewLC( ETrue, ETrue );
- objDuplicate = static_cast<CAccPolHdmiSink*>( obj->DuplicateLC() );
- TUint8* left = reinterpret_cast<TUint8*>( obj );
- TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
- TInt size = sizeof( CAccPolHdmiSink );
- if( Mem::Compare( left, size, right, size ) != KErrNone )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( objDuplicate );
- CleanupStack::PopAndDestroy( obj );
-
- // Rest of the API
- obj = CAccPolHdmiSink::NewLC();
- obj->SetBasicAudioSupport( ETrue );
- if( !obj->BasicAudioSupport() )
- {
- err = KErrArgument;
- }
- obj->SetHdcpSupport( ETrue );
- if( !obj->HdcpSupport() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
- CleanupStack::PopAndDestroy( buf );
- return err;
- }
-
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CheckHdmiAudioFormatObjectL
-// ----------------------------------------------------------------------------------
-TInt CTFAccessoryTestControl::CheckHdmiAudioFormatObjectL()
- {
- TInt err = KErrNone;
- CAccPolHdmiAudioFormat* obj = NULL;
- CAccPolHdmiAudioFormat* objDuplicate = NULL;
- TUint8 objectType = 0;
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- // NewL
- obj = CAccPolHdmiAudioFormat::NewL();
- CleanupStack::PushL( obj );
- CleanupStack::PopAndDestroy( obj );
-
- // NewL - with params
- obj = CAccPolHdmiAudioFormat::NewL( HdmiAudioFormat::KUidFormatPCM16,
- 1,
- 1,
- 1,
- 1,
- 1 );
- if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatPCM16 )
- {
- err = KErrArgument;
- }
- if( obj->ChannelCount() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->BitResolution() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->MaxBitResolution() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->SamFreq() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->FormatDependentValue() != 1 )
- {
- err = KErrArgument;
- }
- CleanupStack::PushL( obj );
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC
- obj = CAccPolHdmiAudioFormat::NewLC();
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC - with params
- obj = CAccPolHdmiAudioFormat::NewLC( HdmiAudioFormat::KUidFormatPCM16,
- 1,
- 1,
- 1,
- 1,
- 1 );
- if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatPCM16 )
- {
- err = KErrArgument;
- }
- if( obj->ChannelCount() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->BitResolution() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->MaxBitResolution() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->SamFreq() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->FormatDependentValue() != 1 )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // Internalize & Externalize
- obj = CAccPolHdmiAudioFormat::NewLC( HdmiAudioFormat::KUidFormatPCM16,
- 1,
- 1,
- 1,
- 1,
- 1 );
- RBufWriteStream writeStream;
- writeStream.Open( *buf );
- writeStream.PushL();
- obj->ExternalizeL( writeStream );
- writeStream.CommitL();
- CleanupStack::PopAndDestroy( &writeStream );
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiAudioFormat::NewLC();
- RBufReadStream readStream;
- readStream.Open( *buf );
- readStream.PushL();
- objectType = readStream.ReadUint8L();
- obj->InternalizeL( readStream );
- if( objectType != EAccPolHdmiAudioFormatObject )
- {
- err = KErrArgument;
- }
- if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatPCM16 )
- {
- err = KErrArgument;
- }
- if( obj->ChannelCount() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->BitResolution() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->MaxBitResolution() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->SamFreq() != 1 )
- {
- err = KErrArgument;
- }
- if( obj->FormatDependentValue() != 1 )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( &readStream );
- CleanupStack::PopAndDestroy( obj );
-
- // DuplicateLC - mem compare can be used since the object does not contain
- // any ponters as memebers
- obj = CAccPolHdmiAudioFormat::NewLC( HdmiAudioFormat::KUidFormatPCM16,
- 1,
- 1,
- 1,
- 1,
- 1 );
- objDuplicate = static_cast<CAccPolHdmiAudioFormat*>( obj->DuplicateLC() );
- TUint8* left = reinterpret_cast<TUint8*>( obj );
- TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
- TInt size = sizeof( CAccPolHdmiSink );
- if( Mem::Compare( left, size, right, size ) != KErrNone )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( objDuplicate );
- CleanupStack::PopAndDestroy( obj );
-
- // Rest of the API
- obj = CAccPolHdmiAudioFormat::NewLC();
- obj->SetAudioFormat( HdmiAudioFormat::KUidFormatEAC3 );
- if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatEAC3 )
- {
- err = KErrArgument;
- }
- obj->SetChannelCount( 2 );
- if( obj->ChannelCount() != 2 )
- {
- err = KErrArgument;
- }
- obj->SetBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample20 );
- if( !( obj->BitResolution() & CAccPolHdmiAudioFormat::EBitsPerSample20 ) )
- {
- err = KErrArgument;
- }
- obj->SetMaxBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample24 );
- if( obj->MaxBitResolution() != CAccPolHdmiAudioFormat::EBitsPerSample24 )
- {
- err = KErrArgument;
- }
- obj->SetSamFreq( CAccPolHdmiAudioFormat::ESamplingFreq192KHz );
- if( !( obj->SamFreq() & CAccPolHdmiAudioFormat::ESamplingFreq192KHz ) )
- {
- err = KErrArgument;
- }
- obj->SetFormatDependentValue( CAccPolHdmiAudioFormat::EBitsPerSample16 );
- if( !( obj->FormatDependentValue() & CAccPolHdmiAudioFormat::EBitsPerSample16 ) )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
- CleanupStack::PopAndDestroy( buf );
-
- return err;
- }
-
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CheckHdmiLatencyObjectL
-// ----------------------------------------------------------------------------------
-TInt CTFAccessoryTestControl::CheckHdmiLatencyObjectL()
- {
- TInt err = KErrNone;
- CAccPolHdmiLatency* obj = NULL;
- CAccPolHdmiLatency* objDuplicate = NULL;
- TUint8 objectType = 0;
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- // NewL
- obj = CAccPolHdmiLatency::NewL();
- CleanupStack::PushL( obj );
- CleanupStack::PopAndDestroy( obj );
-
- // NewL - with params
- obj = CAccPolHdmiLatency::NewL( HdmiLatency::KUidLatency, 100, 200 );
- CleanupStack::PushL( obj );
- if( obj->LatencyType() != HdmiLatency::KUidLatency )
- {
- err = KErrArgument;
- }
- if( obj->AudioLatency() != 100 )
- {
- err = KErrArgument;
- }
- if( obj->VideoLatency() != 200 )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC
- obj = CAccPolHdmiLatency::NewLC();
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC - with params
- obj = CAccPolHdmiLatency::NewLC( HdmiLatency::KUidLatency, 100, 200 );
- if( obj->LatencyType() != HdmiLatency::KUidLatency )
- {
- err = KErrArgument;
- }
- if( obj->AudioLatency() != 100 )
- {
- err = KErrArgument;
- }
- if( obj->VideoLatency() != 200 )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // Internalize & Externalize
- obj = CAccPolHdmiLatency::NewLC( HdmiLatency::KUidLatency, 100, 200 );
- RBufWriteStream writeStream;
- writeStream.Open( *buf );
- writeStream.PushL();
- obj->ExternalizeL( writeStream );
- writeStream.CommitL();
- CleanupStack::PopAndDestroy( &writeStream );
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiLatency::NewLC();
- RBufReadStream readStream;
- readStream.Open( *buf );
- readStream.PushL();
- objectType = readStream.ReadUint8L();
- obj->InternalizeL( readStream );
- if( objectType != EAccPolHdmiLatencyObject )
- {
- err = KErrArgument;
- }
- if( obj->LatencyType() != HdmiLatency::KUidLatency )
- {
- err = KErrArgument;
- }
- if( obj->AudioLatency() != 100 )
- {
- err = KErrArgument;
- }
- if( obj->VideoLatency() != 200 )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( &readStream );
- CleanupStack::PopAndDestroy( obj );
-
- // DuplicateLC - mem compare can be used since the object does not contain
- // any ponters as memebers
- obj = CAccPolHdmiLatency::NewLC( HdmiLatency::KUidLatency, 100, 200 );
- objDuplicate = static_cast<CAccPolHdmiLatency*>( obj->DuplicateLC() );
- TUint8* left = reinterpret_cast<TUint8*>( obj );
- TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
- TInt size = sizeof( CAccPolHdmiLatency );
- if( Mem::Compare( left, size, right, size ) != KErrNone )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( objDuplicate );
- CleanupStack::PopAndDestroy( obj );
-
- // Rest of the API
- obj = CAccPolHdmiLatency::NewLC();
- obj->SetLatencyType( HdmiLatency::KUidLatency );
- if( obj->LatencyType() != HdmiLatency::KUidLatency )
- {
- err = KErrArgument;
- }
- obj->SetAudioLatency( 100 );
- if( obj->AudioLatency() != 100 )
- {
- err = KErrArgument;
- }
- obj->SetVideoLatency( 200 );
- if( obj->VideoLatency() != 200 )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
- CleanupStack::PopAndDestroy( buf );
-
- return err;
- }
-
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CheckHdmiSpeakerAllocationObjectL
-// ----------------------------------------------------------------------------------
-TInt CTFAccessoryTestControl::CheckHdmiSpeakerAllocationObjectL()
- {
- TInt err = KErrNone;
- CAccPolHdmiSpeakerAllocation* obj = NULL;
- CAccPolHdmiSpeakerAllocation* objDuplicate = NULL;
- TUint8 objectType = 0;
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
- TUint32 bits = 0x0;
-
- // NewL
- obj = CAccPolHdmiSpeakerAllocation::NewL();
- CleanupStack::PushL( obj );
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC
- obj = CAccPolHdmiSpeakerAllocation::NewLC();
- CleanupStack::PopAndDestroy( obj );
-
- // NewL - with params
- bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
- CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
- obj = CAccPolHdmiSpeakerAllocation::NewL( bits );
- CleanupStack::PushL( obj );
- if( !obj->FrontCenter() )
- {
- err = KErrArgument;
- }
- if( !obj->RearCenter() )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiSpeakerAllocation::NewL( EFalse,
- EFalse,
- EFalse,
- ETrue,
- EFalse,
- EFalse,
- ETrue,
- EFalse,
- EFalse,
- EFalse,
- EFalse );
- CleanupStack::PushL( obj );
- if( !obj->FrontCenter() )
- {
- err = KErrArgument;
- }
- if( !obj->RearCenter() )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC - with params
- bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
- CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
- obj = CAccPolHdmiSpeakerAllocation::NewLC( bits );
- if( !obj->FrontCenter() )
- {
- err = KErrArgument;
- }
- if( !obj->RearCenter() )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiSpeakerAllocation::NewLC( EFalse,
- EFalse,
- EFalse,
- ETrue,
- EFalse,
- EFalse,
- ETrue,
- EFalse,
- EFalse,
- EFalse,
- EFalse );
- if( !obj->FrontCenter() )
- {
- err = KErrArgument;
- }
- if( !obj->RearCenter() )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // Internalize & Externalize
- bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
- CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
- obj = CAccPolHdmiSpeakerAllocation::NewLC( bits );
- RBufWriteStream writeStream;
- writeStream.Open( *buf );
- writeStream.PushL();
- obj->ExternalizeL( writeStream );
- writeStream.CommitL();
- CleanupStack::PopAndDestroy( &writeStream );
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiSpeakerAllocation::NewLC();
- RBufReadStream readStream;
- readStream.Open( *buf );
- readStream.PushL();
- objectType = readStream.ReadUint8L();
- obj->InternalizeL( readStream );
- if( objectType != EAccPolHdmiSpeakerAllocationObject )
- {
- err = KErrArgument;
- }
- if( !obj->FrontCenter() )
- {
- err = KErrArgument;
- }
- if( !obj->RearCenter() )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( &readStream );
- CleanupStack::PopAndDestroy( obj );
-
- // DuplicateLC - mem compare can be used since the object does not contain
- // any ponters as memebers
- bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
- CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
- obj = CAccPolHdmiSpeakerAllocation::NewLC( bits );
- objDuplicate = static_cast<CAccPolHdmiSpeakerAllocation*>( obj->DuplicateLC() );
- TUint8* left = reinterpret_cast<TUint8*>( obj );
- TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
- TInt size = sizeof( CAccPolHdmiSpeakerAllocation );
- if( Mem::Compare( left, size, right, size ) != KErrNone )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( objDuplicate );
- CleanupStack::PopAndDestroy( obj );
-
- // Rest of the API
- bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
- CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter |
- CAccPolHdmiSpeakerAllocation::EHdmiSpeakerTopCenter;
- obj = CAccPolHdmiSpeakerAllocation::NewLC();
- obj->SetSpeakerAllocation( bits );
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
- {
- err = KErrArgument;
- }
- if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerTopCenter ) )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiSpeakerAllocation::NewLC();
- obj->SetFrontSpeakers( ETrue );
- if( !obj->FrontSpeakers() || obj->SpeakerCount() != 2 )
- {
- err = KErrArgument;
- }
- obj->SetFrontSpeakers( EFalse );
- if( obj->FrontSpeakers() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetRearSpeakers( ETrue );
- if( !obj->RearSpeakers() || obj->SpeakerCount() != 2 )
- {
- err = KErrArgument;
- }
- obj->SetRearSpeakers( EFalse );
- if( obj->RearSpeakers() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetLowFrequencyEffect( ETrue );
- if( !obj->LowFrequencyEffect() || obj->SpeakerCount() != 1 )
- {
- err = KErrArgument;
- }
- obj->SetLowFrequencyEffect( EFalse );
- if( obj->LowFrequencyEffect() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetFrontCenter( ETrue );
- if( !obj->FrontCenter() || obj->SpeakerCount() != 1 )
- {
- err = KErrArgument;
- }
- obj->SetFrontCenter( EFalse );
- if( obj->FrontCenter() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetFrontCenterHigh( ETrue );
- if( !obj->FrontCenterHigh() || obj->SpeakerCount() != 1 )
- {
- err = KErrArgument;
- }
- obj->SetFrontCenterHigh( EFalse );
- if( obj->FrontCenterHigh() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetTopCenter( ETrue );
- if( !obj->TopCenter() || obj->SpeakerCount() != 1 )
- {
- err = KErrArgument;
- }
- obj->SetTopCenter( EFalse );
- if( obj->TopCenter() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetRearCenter( ETrue );
- if( !obj->RearCenter() || obj->SpeakerCount() != 1 )
- {
- err = KErrArgument;
- }
- obj->SetRearCenter( EFalse );
- if( obj->RearCenter() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetFrontLeftRightCenter( ETrue );
- if( !obj->FrontLeftRightCenter() || obj->SpeakerCount() != 2 )
- {
- err = KErrArgument;
- }
- obj->SetFrontLeftRightCenter( EFalse );
- if( obj->FrontLeftRightCenter() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetRearLeftRightCenter( ETrue );
- if( !obj->RearLeftRightCenter() || obj->SpeakerCount() != 2 )
- {
- err = KErrArgument;
- }
- obj->SetRearLeftRightCenter( EFalse );
- if( obj->RearLeftRightCenter() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetFrontWideSpeakers( ETrue );
- if( !obj->FrontWideSpeakers() || obj->SpeakerCount() != 2 )
- {
- err = KErrArgument;
- }
- obj->SetFrontWideSpeakers( EFalse );
- if( obj->FrontWideSpeakers() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- obj->SetFrontHighSpeakers( ETrue );
- if( !obj->FrontHighSpeakers() || obj->SpeakerCount() != 2 )
- {
- err = KErrArgument;
- }
- obj->SetFrontHighSpeakers( EFalse );
- if( obj->FrontHighSpeakers() || obj->SpeakerCount() != 0 )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
- CleanupStack::PopAndDestroy( buf );
-
- return err;
- }
-
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CheckHdmiVideoFormatObjectL
-// ----------------------------------------------------------------------------------
-TInt CTFAccessoryTestControl::CheckHdmiVideoFormatObjectL()
- {
- TInt err = KErrNone;
- CAccPolHdmiVideoFormat* obj = NULL;
- CAccPolHdmiVideoFormat* objDuplicate = NULL;
- TUint8 objectType = 0;
- CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
- CleanupStack::PushL( buf );
- buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
-
- // NewL
- obj = CAccPolHdmiVideoFormat::NewL();
- CleanupStack::PushL( obj );
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC
- obj = CAccPolHdmiVideoFormat::NewLC();
- CleanupStack::PopAndDestroy( obj );
-
- // NewL - with params
- obj = CAccPolHdmiVideoFormat::NewL( E640x480p59_94d60Hz4d3,
- E640x350p85HzRB,
- 1,
- ETrue );
- CleanupStack::PushL( obj );
- if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
- {
- err = KErrArgument;
- }
- if( obj->DmtFixedMode() != E640x350p85HzRB )
- {
- err = KErrArgument;
- }
- if( obj->PixelRepeat() != 1 )
- {
- err = KErrArgument;
- }
- if( !obj->Interlaced() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // NewLC - with params
- obj = CAccPolHdmiVideoFormat::NewLC( E640x480p59_94d60Hz4d3,
- E640x350p85HzRB,
- 1,
- ETrue );
- if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
- {
- err = KErrArgument;
- }
- if( obj->DmtFixedMode() != E640x350p85HzRB )
- {
- err = KErrArgument;
- }
- if( obj->PixelRepeat() != 1 )
- {
- err = KErrArgument;
- }
- if( !obj->Interlaced() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
-
- // Internalize & Externalize
- obj = CAccPolHdmiVideoFormat::NewLC( E640x480p59_94d60Hz4d3,
- E640x350p85HzRB,
- 1,
- ETrue );
- RBufWriteStream writeStream;
- writeStream.Open( *buf );
- writeStream.PushL();
- obj->ExternalizeL( writeStream );
- writeStream.CommitL();
- CleanupStack::PopAndDestroy( &writeStream );
- CleanupStack::PopAndDestroy( obj );
-
- obj = CAccPolHdmiVideoFormat::NewLC();
- RBufReadStream readStream;
- readStream.Open( *buf );
- readStream.PushL();
- objectType = readStream.ReadUint8L();
- obj->InternalizeL( readStream );
- if( objectType != EAccPolHdmiVideoFormatObject )
- {
- err = KErrArgument;
- }
- if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
- {
- err = KErrArgument;
- }
- if( obj->DmtFixedMode() != E640x350p85HzRB )
- {
- err = KErrArgument;
- }
- if( obj->PixelRepeat() != 1 )
- {
- err = KErrArgument;
- }
- if( !obj->Interlaced() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( &readStream );
- CleanupStack::PopAndDestroy( obj );
-
- // DuplicateLC - mem compare can be used since the object does not contain
- // any ponters as memebers
- obj = CAccPolHdmiVideoFormat::NewLC( E640x480p59_94d60Hz4d3,
- E640x350p85HzRB,
- 1,
- ETrue );
- objDuplicate = static_cast<CAccPolHdmiVideoFormat*>( obj->DuplicateLC() );
- TUint8* left = reinterpret_cast<TUint8*>( obj );
- TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
- TInt size = sizeof( CAccPolHdmiVideoFormat );
- if( Mem::Compare( left, size, right, size ) != KErrNone )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( objDuplicate );
- CleanupStack::PopAndDestroy( obj );
-
- // Rest of the API
- obj = CAccPolHdmiVideoFormat::NewLC();
- obj->SetCeaFixedMode( E640x480p59_94d60Hz4d3 );
- if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
- {
- err = KErrArgument;
- }
- obj->SetDmtFixedMode( E640x350p85HzRB );
- if( obj->DmtFixedMode() != E640x350p85HzRB )
- {
- err = KErrArgument;
- }
- obj->SetPixelRepeat( 4 );
- if( obj->PixelRepeat() != 4 )
- {
- err = KErrArgument;
- }
- obj->SetInterlaced( ETrue );
- if( !obj->Interlaced() )
- {
- err = KErrArgument;
- }
- CleanupStack::PopAndDestroy( obj );
- CleanupStack::PopAndDestroy( buf );
-
- return err;
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver* CTFAccessoryTestControl::CreateObserver()
-// ----------------------------------------------------------------------------------
-CTFTestControlObserver* CTFAccessoryTestControl::CreateObserver()
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CreateObserver()" ) ) );
- iStack.AddFirst/*AddLast*/( *CTFTestControlObserver::NewL( *this ) );
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CreateObserver() return" ) ) );
- return iStack.First/*Last*/();
- }
-
-// Not used at this point.
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::ProcessMessageAndCompleteL
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::ProcessMessageAndCompleteL( const RMessage2& aMessage )
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ProcessMessageAndCompleteL enter" ) ) );
- aMessage.Complete( KErrNone );
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ProcessMessageAndCompleteL return" ) ) );
- }
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::MessageCompleteL
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::MessageCompleteL( TInt /*aResult*/)
- {
-
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFAccessoryTestControl::CreateHdmiObjectL
-// ----------------------------------------------------------------------------------
-void CTFAccessoryTestControl::CreateHdmiObjectL( CAccPolObjectCon& aCon,
- THdmiConObjectType aType )
- {
- switch( aType )
- {
- case EAccPolHdmiSinkObject:
- {
- CAccPolHdmiSink* sink = CAccPolHdmiSink::NewLC();
- sink->SetBasicAudioSupport( ETrue );
- sink->SetHdcpSupport( ETrue );
- aCon.AddL( *sink );
- CleanupStack::PopAndDestroy( sink );
- break;
- }
- case EAccPolHdmiAudioFormatObject:
- {
- CAccPolHdmiAudioFormat* audioFormat = CAccPolHdmiAudioFormat::NewLC();
- audioFormat->SetAudioFormat( HdmiAudioFormat::KUidFormatPCM16 );
- audioFormat->SetChannelCount( 2 );
- audioFormat->SetBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample16 );
- audioFormat->SetMaxBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample16 );
- audioFormat->SetFormatDependentValue( CAccPolHdmiAudioFormat::EBitsPerSample16 );
- audioFormat->SamFreq( CAccPolHdmiAudioFormat::ESamplingFreq32KHz );
- aCon.AddL( *audioFormat );
- CleanupStack::PopAndDestroy( audioFormat );
- break;
- }
- case EAccPolHdmiLatencyObject:
- {
- CAccPolHdmiLatency* latency = CAccPolHdmiLatency::NewLC();
- latency->SetLatencyType( HdmiLatency::KUidLatency );
- latency->SetAudioLatency( 100 );
- latency->SetVideoLatency( 200 );
- aCon.AddL( *latency );
- CleanupStack::PopAndDestroy( latency );
- break;
- }
- case EAccPolHdmiSpeakerAllocationObject:
- {
- CAccPolHdmiSpeakerAllocation* speakerAllocation =
- CAccPolHdmiSpeakerAllocation::NewLC();
- speakerAllocation->SetFrontSpeakers( ETrue );
- speakerAllocation->SetRearSpeakers( ETrue );
- speakerAllocation->SetLowFrequencyEffect( ETrue );
- speakerAllocation->SetFrontCenter( ETrue );
- speakerAllocation->SetFrontCenterHigh( ETrue );
- speakerAllocation->SetTopCenter( ETrue );
- speakerAllocation->SetRearCenter( ETrue );
- speakerAllocation->SetFrontLeftRightCenter( ETrue );
- speakerAllocation->SetRearLeftRightCenter( ETrue );
- speakerAllocation->SetFrontWideSpeakers( ETrue );
- speakerAllocation->SetFrontHighSpeakers( ETrue );
- aCon.AddL( *speakerAllocation );
- CleanupStack::PopAndDestroy( speakerAllocation );
- break;
- }
- case EAccPolHdmiVideoFormatObject:
- {
- CAccPolHdmiVideoFormat* videoFormat = CAccPolHdmiVideoFormat::NewLC();
- videoFormat->SetCeaFixedMode( E640x480p59_94d60Hz4d3 );
- videoFormat->SetDmtFixedMode( E640x480p85HzRB );
- videoFormat->SetInterlaced( EFalse );
- aCon.AddL( *videoFormat );
- CleanupStack::PopAndDestroy( videoFormat );
- break;
- }
- default:
- {
- break;
- }
- }
- }
-
-
-void CTFAccessoryTestControl::AccessoryConnectionOpenClose(TTFAccessoryFunction aCase, TInt* aRetval)
- {
- switch(aCase)
- {
- case ETFAccessoryConnection_Open:
- {
- if ( iAccessoryConnection == NULL )
- {
- iAccessoryConnection = new ( ELeave ) RAccessoryConnection;
- *aRetval = iAccessoryConnection->CreateSubSession( iAccessoryServer );
- COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL(TTFAccessoryTestCaseStateControl& aParameter) - ETFAccessoryConnection_Open - Sub session created - (%d)" ), *aRetval ) );
- }
- else
- {
- *aRetval = KErrNone;
- COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL(TTFAccessoryTestCaseStateControl& aParameter) - ETFAccessoryConnection_Open - Sub session not created - (%d)" ), *aRetval ) );
- }
- }
- break;
-
- case ETFAccessoryConnection_Close:
- {
- TRACE_ASSERT( iAccessoryConnection != NULL );
-
- if ( iAccessoryConnection != NULL )
- {
- iAccessoryConnection->CloseSubSession();
- delete iAccessoryConnection;
- iAccessoryConnection = NULL;
- COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL(TTFAccessoryTestCaseStateControl& aParameter) - ETFAccessoryConnection_Close - Sub session closed" ) ) );
- }
- *aRetval = KErrNone;
- }
- break;
-
- default:
- break;
- }
-
- }
-
-void CTFAccessoryTestControl::FindAndCheckRequestL( TInt* aRetval, TTFAccessoryTestCaseStateControl& aParameter )
- {
- CTFAccessoryTestCaseControl* testCase = STATIC_CAST( CTFAccessoryTestCaseControl*, CurrentTestCase());
- TInt errVal = 0;
-
- TRACE_ASSERT( testCase != NULL );
- if ( testCase != NULL )
- {
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::FindAndCheckRequest() - inside if ( testCase != NULL )" ) ) );
- if(!iStack.IsEmpty())
- {
- iStackIter.SetToFirst();
-
- while ( ( iObserverItem = iStackIter++ ) != NULL )
- {
- if(iObserverItem->FindRequest(aParameter.iRequestType))
- {
- testCase->CheckRequest( iObserverItem->iStatus,
- iObserverItem->iValue,
- iObserverItem->iCapabilityName,
- &errVal );
-
- if(errVal == KTFDontDeleteObserver)
- {
- aParameter.iArg1 = KTFDontDeleteObserver;
- }
-
-
- if ( !iStack.IsEmpty() ) // Check if observes are already deleted by CheckRequest()
- {
- if( KTFDontDeleteObserver != aParameter.iArg1 )
- {
- if (iObserverItem->iStatus == KRequestPending )
- {
- User::WaitForRequest(iObserverItem->iStatus);
- }
- iStack.Remove( *iObserverItem );
- delete iObserverItem;
- }
- else
- {
- User::Leave( KTFDontDeleteObserver );
- }
- }
- else
- {
- *aRetval = KErrGeneral;
- }
- }
- }
- }
- else
- {
- *aRetval = KErrGeneral;
- }
- }
-
- TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::FindAndCheckRequest() returning and setting *aRetval = KErrNone )" ) ) );
- *aRetval = KErrNone;
- }
-
-
-void CTFAccessoryTestControl::AccessorySettingsOpenClose( TTFAccessoryFunction aCase, TInt* aRetval )
- {
- switch(aCase)
- {
- case ETFAccessorySettings_Open:
- {
- if ( iAccessorySettings == NULL )
- {
- iAccessorySettings = new ( ELeave ) RAccessorySettings;
- *aRetval = iAccessorySettings->CreateSubSession( iAccessoryServer );
- }
- else
- *aRetval = KErrNone;
- }
- break;
-
- case ETFAccessorySettings_Close:
- {
- TRACE_ASSERT( iAccessorySettings != NULL );
-
- if ( iAccessorySettings != NULL )
- {
- iAccessorySettings->CloseSubSession();
- delete iAccessorySettings;
- iAccessorySettings = NULL;
- }
- *aRetval = KErrNone;
- }
- break;
-
- default:
- break;
-
- }
- }
-
-void CTFAccessoryTestControl::SetSeveralAccessoryModeSetting( TInt* aRetval )
- {
- TAccModeSetting accModeSettingIn;
- TAccMode tAccMode = EAccModeWirelessHeadset;
- TBuf< KMaxAccModeSetting > aDesIn;
- // Set
- // setting 1
- accModeSettingIn.SetId( 11 ); // unknown TInt
- accModeSettingIn.SetTInt( 1 );
- TAccModeSettingArray arrayIn;
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 2
- accModeSettingIn.SetId( 12 ); // unknown Des
- _LIT( KAccSetting2, "012345678901234567890" );
- aDesIn.Copy( KAccSetting2 );
- accModeSettingIn.SetTDes( aDesIn );
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 3
- accModeSettingIn.SetId( 13 ); // unknown TBool
- accModeSettingIn.SetTBool( ETrue );
- arrayIn.AddSetting( accModeSettingIn );
-
- *aRetval = iAccessorySettings->SetAccessoryModeSettingsL( tAccMode, arrayIn );
- }
-
-void CTFAccessoryTestControl::GetSeveralAccessoryModeSetting( TInt* aRetval )
- {
- TAccModeSetting accModeSettingOut;
- TAccMode tAccMode = EAccModeWirelessHeadset;
- TBuf< KMaxAccModeSetting > aDesOut;
- TAccModeSettingArray arrayOut;
- TInt intOut( 0 );
- // set input parameters for GetAccessoryModeSettings()
- // setting 11
- accModeSettingOut.SetId( 11 );
- arrayOut.AddSetting( accModeSettingOut );
-
- // setting 12
- accModeSettingOut.SetId( 12 );
- arrayOut.AddSetting( accModeSettingOut );
-
- // setting 13
- accModeSettingOut.SetId( 13 );
- arrayOut.AddSetting( accModeSettingOut );
-
- *aRetval = iAccessorySettings->GetAccessoryModeSettings( tAccMode, arrayOut );
-
- // Check that got settings are right
-
- TInt count = arrayOut.GetArraySize();
- TInt foundCount(0);
-
- for( TInt index = 0; index < count; index++ )
- {
- arrayOut.GetSetting( index, accModeSettingOut );
-
- if( 11 == accModeSettingOut.Id() )
- {
-
- accModeSettingOut.GetTInt( intOut);
-
- if( 1 == intOut )
- {
- foundCount++;
- }
- }
-
-
- if( 12 == accModeSettingOut.Id() )
- {
- accModeSettingOut.GetTDes( aDesOut );
-
- if( KErrNone == aDesOut.Compare( _L("012345678901234567890") ) )
- {
- foundCount++;
- }
-
- }
-
- if( 13 == accModeSettingOut.Id() )
- {
-
- accModeSettingOut.GetTBool( intOut );
-
- if( intOut )
- {
- foundCount++;
- }
- }
- }
-
- if(foundCount != 3)
- {
- *aRetval = KErrNotFound;
- }
-
- //
- // Reset Settings
- //
- TAccModeSetting accModeSettingIn;
- TBuf< KMaxAccModeSetting > aDesIn;
- // Set
- // setting 1
- accModeSettingIn.SetId( 11 ); // unknown TInt
- accModeSettingIn.SetTInt( 0 );
- TAccModeSettingArray arrayIn;
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 2
- accModeSettingIn.SetId( 12 ); // unknown Des
- _LIT( KAccSetting2, "" );
- aDesIn.Copy( KAccSetting2 );
- accModeSettingIn.SetTDes( aDesIn );
- arrayIn.AddSetting( accModeSettingIn );
-
- // setting 3
- accModeSettingIn.SetId( 13 ); // unknown TBool
- accModeSettingIn.SetTBool( EFalse );
- arrayIn.AddSetting( accModeSettingIn );
-
- iAccessorySettings->SetAccessoryModeSettingsL( tAccMode, arrayIn );
-
- }
-
-void CTFAccessoryTestControl::SetIntValue( TTFAccessoryTestCaseStateControl& aParameter, TInt *aRetval )
- {
- switch( aParameter.iArg3 )
- {
- case KAccSetVolumeLevel:
- {
- //AccPolCommonNameValuePairs.h contains following example code
- RAccessoryControl accessoryControl;
- accessoryControl.CreateSubSession( iAccessoryServer );
-
- CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL();
- CleanupStack::PushL( nameArray );
- accessoryControl.GetSubblockNameArrayL( iGenericId[aParameter.iGid], *nameArray );
-
- TAccPolNameRecord nameRecord;
- nameRecord.SetNameL( KAccSetVolumeLevel );
- TAccValueTypeTInt value;
-
- if( nameArray->HasName( KAccSetVolumeLevel ) )
- {
- accessoryControl.GetValueL( iGenericId[aParameter.iGid], nameRecord, value );
- value.iValue = value.iValue | aParameter.iArg1;
- accessoryControl.AccessoryValueChangedNotifyL( iGenericId[aParameter.iGid], nameRecord, value );
- }
-
- CleanupStack::PopAndDestroy( nameArray );
- accessoryControl.CloseSubSession();
- *aRetval = KErrNone;
- }
- break;
-
- default:
- {
- TAccPolNameRecord aNameRecord;
- aNameRecord.SetNameL( aParameter.iArg3 );
- TAccValueTypeTInt aIntValue;
- aIntValue.iValue = aParameter.iArg1;
- *aRetval = iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, aIntValue );
- }
- break;
- }
-
- }
-
-void CTFAccessoryTestControl::SelectionDialog( TTFAccessoryFunction aCase, TInt* aRetval )
- {
- switch(aCase)
- {
- case ETFSelectionDialogText:
- {
- const TUid KAccFwUiDialogNotifierUid = { 0x10205062 };
-
- RNotifier notifier;
- notifier.Connect();
-
- TInt selectionListBitmask = 255;
- TInt reply = 0;
-
- TPckg<TInt> replyPck( reply);
- TPckg<TUint32> selectionBitmaskPackage( selectionListBitmask);
-
- //activate active object
- TRequestStatus status;
- status = KRequestPending;
-
- //open ui
- notifier.StartNotifierAndGetResponse( status, KAccFwUiDialogNotifierUid, selectionBitmaskPackage, replyPck);
-
- User::WaitForRequest( status);
-
-
- notifier.Close();
-
- *aRetval = KErrNone;
- }
-
- case ETFSelectionDialogCancel:
- {
- const TUid KAccFwUiDialogNotifierUid = { 0x10205062 };
-
- RNotifier notifier;
- notifier.Connect();
-
- TInt selectionListBitmask = 7;
- TInt reply = 0;
-
- TPckg<TInt> replyPck( reply);
- TPckg<TUint32> selectionBitmaskPackage( selectionListBitmask);
-
- //activate active object
- TRequestStatus status;
-
- //open ui
- notifier.StartNotifierAndGetResponse( status, KAccFwUiDialogNotifierUid, selectionBitmaskPackage, replyPck);
- User::After( 2500000);
- notifier.CancelNotifier( KAccFwUiDialogNotifierUid);
-
- // Implementation of the dialog is changed. Request is completed every time
- User::WaitForRequest( status );
-
- notifier.Close();
-
- *aRetval = KErrNone;
- }
-
- default:
- break;
-
- }
-
- }
-
-void CTFAccessoryTestControl::CheckConnectedAccessory( TInt* aRetval )
- {
- *aRetval = KErrNone;
-
- TAccPolGenericID genID; // TGeneric ID that should be connected
- TAccPolGenericID genIDConnected; // TGeneric ID that is connected
- TAccPolGIDHeader iGenericIDHeader; // Header of the GID that should be connected
- TAccPolGIDHeader iGenericIDHeaderConnected; // Header of the connected GID
- TAccPolGenericIDArray genericIdArray; // Array of connected generic ID's
- CAccConGenericID* aGenericID = CAccConGenericID::NewL(); // This might be needed for capabilities
- CAccPolSubblockNameArray* nameArrayConnected = CAccPolSubblockNameArray::NewL();
-
- CleanupStack::PushL( aGenericID );
- CleanupStack::PushL( nameArrayConnected );
-
- TAccPolGenericID genericID = aGenericID->GenericID();
-
- TBuf<KHWModelIDMaxLength> hwModelID(_L("headset"));
- // Set GenericID header
- iGenericIDHeader.iAccessoryDeviceType = KDTHeadset;
- iGenericIDHeader.iPhysicalConnection = KPCWired;
- iGenericIDHeader.iApplicationProtocol = 0x0;
-
- iGenericIDHeader.iCapabilitiesSubblocks = KSBAudioSubblock;
-
- iGenericIDHeader.iHWModelID = hwModelID;
- iGenericIDHeader.iHWDeviceID = 0x0;
- iGenericIDHeader.iDBID = 0x0;
-
- RAccessoryConnection* accessoryConnection = new ( ELeave ) RAccessoryConnection();
- CleanupStack::PushL( accessoryConnection );
- accessoryConnection->CreateSubSession( iAccessoryServer );
- accessoryConnection->GetAccessoryConnectionStatus( genericIdArray );
- CleanupStack::PopAndDestroy( accessoryConnection );
-
- genIDConnected = genericIdArray.GetGenericIDL( 0 );
-
- RAccessorySingleConnection singleConnect;// = new ( ELeave ) RAccessoryConnectionBase();
- singleConnect.CreateSubSession( iAccessoryServer );
- singleConnect.GetSubblockNameArrayL( genIDConnected, *nameArrayConnected );
-
- singleConnect.CloseSubSession();
-
- iGenericIDHeaderConnected.iAccessoryDeviceType = genIDConnected.DeviceTypeCaps();
- iGenericIDHeaderConnected.iPhysicalConnection = genIDConnected.PhysicalConnectionCaps();
- iGenericIDHeaderConnected.iApplicationProtocol = genIDConnected.ApplicationProtocolCaps();
- iGenericIDHeaderConnected.iCapabilitiesSubblocks = genIDConnected.SubblockCaps();
- iGenericIDHeaderConnected.iHWModelID = genIDConnected.HWModelID();
- iGenericIDHeaderConnected.iHWDeviceID = genIDConnected.HWDeviceID();
- iGenericIDHeaderConnected.iDBID = 0x0;
-
- //Check GenericID header
- if( iGenericIDHeader.iAccessoryDeviceType != iGenericIDHeaderConnected.iAccessoryDeviceType )
- {
- *aRetval = EFalse;
- }
- if( iGenericIDHeader.iPhysicalConnection != iGenericIDHeaderConnected.iPhysicalConnection )
- {
- *aRetval = EFalse;
- }
- if( iGenericIDHeader.iApplicationProtocol != iGenericIDHeaderConnected.iApplicationProtocol )
- {
- *aRetval = EFalse;
- }
- if( iGenericIDHeader.iCapabilitiesSubblocks != iGenericIDHeaderConnected.iCapabilitiesSubblocks )
- {
- *aRetval = EFalse;
- }
- if( iGenericIDHeader.iHWModelID != iGenericIDHeaderConnected.iHWModelID )
- {
- *aRetval = EFalse;
- }
- if( iGenericIDHeader.iHWDeviceID != iGenericIDHeaderConnected.iHWDeviceID )
- {
- *aRetval = EFalse;
- }
- if( !( nameArrayConnected->HasName( KAccStereoAudio ) ) )
- {
- *aRetval = EFalse;
- }
-
- if( !( nameArrayConnected->HasName( KAccAudioOutConnector ) ) )
- {
- *aRetval = EFalse;
- }
-
- if( !( nameArrayConnected->HasName( KAccAudioOutputType ) ) )
- {
- *aRetval = EFalse;
- }
- //CleanupStack::PopAndDestroy( nameValueArray );
- CleanupStack::PopAndDestroy( nameArrayConnected );
- CleanupStack::PopAndDestroy( aGenericID );
-
- }
-
-
-void CTFAccessoryTestControl::CallTClassMethods( TInt* aRetval )
- {
- // Settings();
- Policy();
- *aRetval = KErrNone;
- }
-
-void CTFAccessoryTestControl::Settings()
- {
- TAccModeSettingArray array;
- array.Reset();
- TInt ret = array.GetMaxArraySize();
- TAccModeSetting setting;
- TUint32 settingId( 1 );
- setting.SetId( settingId );
- array.AddSetting( setting );
- TAccModeSetting setting2;
- ret = array.GetSetting( 0, setting2 );
- ret = array.GetArraySize();
- }
-
-void CTFAccessoryTestControl::Policy()
- {
- TInt valueInt( 1 );
- TUint32 valueUInt( 1 );
- TDesC8 des( _L8( "timo" ) );
- //TDes8 valueDesc = des;
- TAccPolNameRecord nameRecord;
- TAccPolValueRecord valRec( des, EAPVPolicy );
- TAccPolNameValueRecord nameValRec;
- TAccPolNameValueRecord nameValRec1( nameRecord, valRec );
- TAccPolNameValueRecord nameValRec2( valueUInt, valueInt, EAPVInt, EAPVPolicy );
- TAccPolNameValueRecord nameValRec3( valueUInt, des, EAPVPolicy );
- TAccPolNameValueRecord nameValRec4( valueUInt );
- //TDesC8 valueToGet;
- valRec.GetValueL( des );
- valRec.SetValue( des );
- //valRec.SetValue( valueToGet );
- TAccPolValueRecord valRec1( valueInt, EAPVInt, EAPVPolicy );
- valRec1.SetValue( valueInt );
- valRec1.SetLocation( EAPVPolicy );
- valRec1.SetL( valueInt, EAPVInt, EAPVPolicy );
- }
-
-void CTFAccessoryTestControl::GetBoolAccessoryModeSetting( TTFAccessoryTestCaseStateControl& aParameter, TInt* aRetval )
- {
- TBool aSettingsValueBool;
-
- TAccMode aAccMode = (TAccMode)aParameter.iArg1;
- TAccModeSetting aSetting;
- aSetting.SetId(aParameter.iArg2);
-
- *aRetval = iAccessorySettings->GetAccessoryModeSetting(aAccMode, aSetting);
-
- if( aSetting.Type() == EAccModeSettingBool)
- {
- *aRetval = aSetting.GetTBool(aSettingsValueBool);
-
- if(*aRetval != KErrNotFound)
- {
- if(aSettingsValueBool == (TBool)aParameter.iArg4)
- {
- *aRetval = KErrNone;
- }
- else
- {
- *aRetval = KErrArgument;
- }
- }
- }
- else
- {
- *aRetval = KErrNotFound;
- }
- }
-
-void CTFAccessoryTestControl::GetIntAccessoryModeSetting( TTFAccessoryTestCaseStateControl& aParameter, TInt* aRetval )
- {
- TInt aSettingsValueInt;
-
- TAccMode aAccMode = (TAccMode)aParameter.iArg1;
- TAccModeSetting aSetting;
- aSetting.SetId(aParameter.iArg2);
-
- *aRetval = iAccessorySettings->GetAccessoryModeSetting(aAccMode, aSetting);
-
- if(aSetting.Type() == EAccModeSettingInt)
- {
- *aRetval = aSetting.GetTInt(aSettingsValueInt);
-
- if(*aRetval != KErrNotFound)
- {
- if( aSettingsValueInt == aParameter.iArg4 )
- {
- *aRetval = KErrNone;
- }
- else
- {
- *aRetval = KErrArgument;
- }
- }
- }
- else
- {
- *aRetval = KErrNotFound;
- }
- }
-
-void CTFAccessoryTestControl::GetDesAccessoryModeSetting( TTFAccessoryTestCaseStateControl& aParameter, TInt* aRetval )
- {
- TBuf<KMaxAccModeSetting> aSettingsValueDes;
-
- TAccMode aAccMode = (TAccMode)aParameter.iArg1;
- TAccModeSetting aSetting;
- aSetting.SetId( aParameter.iArg2 );
-
- *aRetval = iAccessorySettings->GetAccessoryModeSetting( aAccMode, aSetting );
-
- if( aSetting.Type() == EAccModeSettingDes )
- {
- *aRetval = aSetting.GetTDes( aSettingsValueDes );
-
- if(*aRetval != KErrNotFound)
- {
- TBuf<KMaxAccModeSetting> buffer;
- buffer.Num( aParameter.iArg3 );
- if( KErrNone == aSettingsValueDes.Compare( buffer ) )
- {
- *aRetval = KErrNone;
- }
- else
- {
- *aRetval = KErrArgument;
- }
- }
- }
- else
- {
- *aRetval = KErrNotFound;
- }
- }
-
-// End of file
+/*
+ * Copyright (c) 2005 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:
+ *
+ */
+
+// INCLUDE FILES
+
+#include <ctffactory.h>
+#include <tftypes.h>
+#include <AccPolSubblockNameArray.h>
+#include "siftrace.h"
+#include "CtfAccessoryTestcontrol.h"
+#include "CtfAccessoryTestCaseControl.h"
+#include <AccPolProprietaryNameValuePairs.h>
+#include <AccConGenericID.h>
+#include <AccPolPropGenericid.h>
+#include <AccessoryConnectionBase.h>
+#include <s32mem.h>
+
+#include <accpolobjectcon.h>
+#include <accpolaudiostreamformat.h>
+#include <accpolterminalbase.h>
+#include <accpoloutputterminal.h>
+#include <accpolinputterminal.h>
+#include <accpolmixerunit.h>
+#include <accpolfeatureunit.h>
+#include <accpolvolumecontrol.h>
+#include <accpolmutecontrol.h>
+#include <accpolselectorunit.h>
+
+#include <StartupDomainPSKeys.h>
+
+#include <E32Math.h>
+#include "AccClientServerMessages.h"
+#include <e32property.h>
+
+#include <accpolhdmiobjectcon.h>
+#include <tvoutconfigdef.h>
+
+//
+// ----------------------------------------------------------------------------------
+// MTFAccessoryTestControl* GetAccessoryTestControl
+// ----------------------------------------------------------------------------------
+MTFAccessoryTestControl* GetAccessoryTestControl( void )
+ {
+ CTFStub* stub = CTFFactory::Stub( KTFStubTypeAccessoryControl );
+ return STATIC_CAST( CTFAccessoryTestControl*, stub );
+ }
+//
+// ----------------------------------------------------------------------------------
+// MTFAccessoryTestControl::MTFAccessoryTestControl
+// ----------------------------------------------------------------------------------
+MTFAccessoryTestControl::MTFAccessoryTestControl( void )
+ {
+ }
+//
+// ----------------------------------------------------------------------------------
+// MTFAccessoryTestControl::~MTFAccessoryTestControl
+// ----------------------------------------------------------------------------------
+MTFAccessoryTestControl::~MTFAccessoryTestControl( void )
+ {
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CTFAccessoryTestControl
+// ----------------------------------------------------------------------------------
+CTFAccessoryTestControl::CTFAccessoryTestControl( void ) :
+ CTFRemoteStub( KTFStubTypeAccessoryControl ),
+ iStack( CTFTestControlObserver::iOffset ), iStackIter( iStack )
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CTFAccessoryTestControl()" ) ) );
+
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CTFAccessoryTestControl() - return" ) ) );
+ }
+
+//lint -e1740 Pointer not directly deleted by destructor
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::~CTFAccessoryTestControl
+// ----------------------------------------------------------------------------------
+CTFAccessoryTestControl::~CTFAccessoryTestControl( void )
+ {
+
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::~CTFAccessoryTestControl()" ) ) );
+ RProperty::Delete( KTFAccessoryTestProperty, KTFAccessoryMethod );
+
+ ResetAccessoryServices();
+
+ iAccessoryServer.Disconnect();
+
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::~CTFAccessoryTestControl() - Accessory Server connection closed" ) ) );
+
+ }
+//lint +e1740
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::InitializeL
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::InitializeL( void )
+ {
+
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::InitializeL( void ) - enter" ) ) );
+ TInt retval( KErrNone );
+
+ iAccessoryConnection = NULL;
+ iAccessorySingleConnection = NULL;
+ iAccessoryControl = NULL;
+ iAccessorySettings = NULL;
+ iAccessoryMode = NULL;
+ iAccessoryAudioControl = NULL;
+ iAccessoryBTControl = NULL;
+
+ iStreamContainer = NULL;
+ iTopologyContainer = NULL;
+ iSpeakerRightVolume = NULL;
+ iSpeakerLeftVolume = NULL;
+ iSpeakerMute = NULL;
+ iMicRightVolume = NULL;
+ iMicLeftVolume = NULL;
+
+ TAccPolGenericID emptyInstance;
+ for( TInt i( 0 ); i < 10; i++ )
+ {
+ iGenericId[i] = emptyInstance;
+ }
+
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::InitializeL()" ) ) );
+
+ User::LeaveIfError( iAccessoryServer.Connect() );
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::InitializeL() - Connected to accessory server" ) ) );
+
+ retval = RProperty::Define( KTFAccessoryTestProperty,
+ KTFAccessoryMethod,
+ RProperty::EByteArray );
+ if( retval != KErrAlreadyExists )
+ User::LeaveIfError( retval );
+ //attach to property
+
+
+ RProperty systemState;
+ User::LeaveIfError( systemState.Attach( KPSUidStartup, KPSGlobalSystemState ) );
+ TInt value( KErrNone );
+ //check value
+ TInt err = systemState.Get( value );
+
+ if( err != KErrNone )
+ {
+ err = systemState.Define( KPSUidStartup,
+ KPSGlobalSystemState,
+ RProperty::EInt );
+ TInt err = systemState.Get( value );
+ }
+
+ if( value != ESwStateNormalRfOn || value != ESwStateNormalRfOff || value
+ != ESwStateNormalBTSap )
+ {
+ TInt err = systemState.Set( KPSUidStartup,
+ KPSGlobalSystemState,
+ ESwStateNormalRfOn );
+ }
+
+ iInitialized = ETrue;
+
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::InitializeL - return" ) ) );
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::InitializeL( void ) - return" ) ) );
+ }
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::ResetAccessoryServices
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::ResetAccessoryServices( void )
+ {
+ ResetAccessoryServer();
+
+ iInitialized = EFalse;
+
+ iAccessoryServer.Close();
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::ResetAccessoryServer
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::ResetAccessoryServer( void )
+ {
+
+ COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::ResetAccessoryServer()" ) ) );
+
+ CTFTestControlObserver* observerItem;
+ if( !iStack.IsEmpty() )
+ {
+ iStackIter.SetToFirst();
+
+ while( ( observerItem = iStackIter++ ) != NULL )
+ {
+ observerItem->Cancel();
+ User::After( 2000000 );
+ iStack.Remove( *observerItem );
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Remove Observer" ) ) );
+ delete observerItem;
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Delete Observer" ) ) );
+ };
+ }
+
+ iStack.Reset();
+
+ TAccPolGenericID emptyInstance;
+
+ for( TInt i( 0 ); i < 10; i++ )
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Clear instances" ) ) );
+ if( KErrNotFound != iGenericId[i].UniqueID() )
+ {
+ if( iGenericId[i].PhysicalConnectionCaps( KPCBluetooth ) )
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- BT Found" ) ) );
+ TBTDevAddr BTDevAddr( iGenericId[i].DeviceAddress() );
+ if( iAccessoryBTControl != NULL )
+ {
+ TRequestStatus status;
+ status = KRequestPending;
+ iAccessoryBTControl->DisconnectAccessory( status, BTDevAddr );
+ User::WaitForRequest( status );
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- BT Disconnected" ) ) );
+ }
+ }
+ else
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Wired Found" ) ) );
+ TPckgBuf<TTFAccessoryPublishAndSubscribe> buf;
+ buf().iMethod = ETFAsyDisc;
+ User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty,
+ KTFAccessoryMethod,
+ buf ) );
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ResetAccessoryServer -- Wired Disconnected" ) ) );
+ }
+ }
+ iGenericId[i] = emptyInstance;
+ }
+
+ if( iAccessoryConnection != NULL )
+ {
+ iAccessoryConnection->CloseSubSession();
+ delete iAccessoryConnection;
+ iAccessoryConnection = NULL;
+ }
+
+ if( iAccessorySingleConnection != NULL )
+ {
+ iAccessorySingleConnection->CloseSubSession();
+ delete iAccessorySingleConnection;
+ iAccessorySingleConnection = NULL;
+ }
+ if( iAccessoryControl != NULL )
+ {
+ iAccessoryControl->CloseSubSession();
+ delete iAccessoryControl;
+ iAccessoryControl = NULL;
+ }
+ if( iAccessorySettings != NULL )
+ {
+ iAccessorySettings->CloseSubSession();
+ delete iAccessorySettings;
+ iAccessorySettings = NULL;
+ }
+ if( iAccessoryMode != NULL )
+ {
+ iAccessoryMode->CloseSubSession();
+ delete iAccessoryMode;
+ iAccessoryMode = NULL;
+ }
+
+ if( iAccessoryAudioControl != NULL )
+ {
+ iAccessoryAudioControl->CloseSubSession();
+ delete iAccessoryAudioControl;
+ iAccessoryAudioControl = NULL;
+ }
+
+ if( iAccessoryBTControl != NULL )
+ {
+ iAccessoryBTControl->CloseSubSession();
+ delete iAccessoryBTControl;
+ iAccessoryBTControl = NULL;
+ }
+
+ if( iSpeakerRightVolume != NULL )
+ {
+ delete iSpeakerRightVolume;
+ iSpeakerRightVolume = NULL;
+ }
+
+ if( iSpeakerLeftVolume != NULL )
+ {
+ delete iSpeakerLeftVolume;
+ iSpeakerLeftVolume = NULL;
+ }
+
+ if( iSpeakerMute != NULL )
+ {
+ delete iSpeakerMute;
+ iSpeakerMute = NULL;
+ }
+
+ if( iMicRightVolume != NULL )
+ {
+ delete iMicRightVolume;
+ iMicRightVolume = NULL;
+ }
+
+ if( iMicLeftVolume != NULL )
+ {
+ delete iMicLeftVolume;
+ iMicLeftVolume = NULL;
+ }
+
+ if( iStreamContainer != NULL )
+ {
+ delete iStreamContainer;
+ iStreamContainer = NULL;
+ }
+
+ if( iTopologyContainer != NULL )
+ {
+ delete iTopologyContainer;
+ iTopologyContainer = NULL;
+ }
+
+ COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::ResetAccessoryServer() - Success" ) ) );
+ }
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CancelOutStandingRequest
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::CancelOutStandingRequest()
+ {
+ iObserverItem->Cancel();
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::FillObjectL
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::FillObjectL( CAccPolAudioStreamFormatCon* aContainer,
+ TStreamConObjectType aobjectType,
+ TInt64 aNumberOfObjects )
+ {
+
+ for( TInt i = 0; i < aNumberOfObjects; i++ )
+ {
+ switch( aobjectType )
+ {
+ case EAccPolAudioInputStreamObject:
+ {
+ CAccPolAudioStreamFormat* stream =
+ CAccPolAudioStreamFormat::NewLC( aobjectType,
+ i,
+ KUidFormatPCM16,
+ CAccPolAudioStreamFormat::EStereo,
+ CAccPolAudioStreamFormat::EBitsPerSample16,
+ i + 200 );
+ aContainer->AddL( *stream );
+ CleanupStack::PopAndDestroy( stream );
+ }
+ break;
+
+ case EAccPolAudioOutputStreamObject:
+ {
+
+ CAccPolAudioStreamFormat
+ * stream =
+ CAccPolAudioStreamFormat::NewLC( EAccPolAudioOutputStreamObject );
+
+ stream->SetUnitId( i );
+ stream->SetAudioFormat( KUidFormatPCM16 );
+ stream->SetStreamType( CAccPolAudioStreamFormat::EMono );
+ stream->SetBitResolution( CAccPolAudioStreamFormat::EBitsPerSample32 );
+ stream->SetSamFreq( i + 200 );
+
+ aContainer->AddL( *stream );
+ CleanupStack::PopAndDestroy( stream );
+ }
+ break;
+
+ default:
+ {
+ TRACE_ASSERT_ALWAYS;
+ }
+ break;
+ }
+ }
+
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CreateObjectPubSub
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::CreateObjectPubSubL( TStreamConObjectType aobjectType,
+ TInt64 aNumberOfObjects,
+ TStreamConObjectType aobjectType2,
+ TInt64 aNumberOfObjects2 )
+ {
+ RProperty prop;
+ prop.Define( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ RProperty::EByteArray );
+
+ CAccPolAudioStreamFormatCon* container =
+ CAccPolAudioStreamFormatCon::NewLC();
+
+ FillObjectL( container, aobjectType, aNumberOfObjects );
+ FillObjectL( container, aobjectType2, aNumberOfObjects2 );
+
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ //Externalize container to buf
+ RBufWriteStream wStrm;
+ ( void )wStrm.Open( *buf );
+ wStrm.PushL();
+ container->ExternalizeL( wStrm );
+ wStrm.CommitL();
+ wStrm.Close();
+ wStrm.Pop();
+
+ TPtr8 ptr( buf->Ptr( 0 ) );
+
+ TInt retval = prop.Set( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ ptr );
+
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( container );
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CreateObjectPubSub
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::CreateTopologyObjectsToPubSubL(
+ TTFAccessoryTestCaseStateControl& aParameter )
+ {
+ RProperty prop;
+ prop.Define( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ RProperty::EByteArray );
+
+ CAccPolAudioTopologyObjectCon* aObject =
+ CAccPolAudioTopologyObjectCon::NewLC();
+
+ //Speaker
+ //OT-3
+ CAccPolOutputTerminal* OT3 = CAccPolOutputTerminal::NewLC( 3,
+ CAccPolOutputTerminal::EAPTHeadphone,
+ 2 );
+ //Connected to FU-2
+ aObject->AddL( *OT3 );
+
+ //FU2
+ CAccPolFeatureUnit* FU2 = CAccPolFeatureUnit::NewLC( 2, 8 );
+ // Volume control object.
+ CAccPolVolumeControl* speakerRightVolume =
+ CAccPolVolumeControl::NewLC( KAccRightFrontChannel, 7, 5, 20, 5 );
+ CAccPolVolumeControl* speakerLeftVolume =
+ CAccPolVolumeControl::NewLC( KAccLeftFrontChannel, 7, 5, 20, 5 );
+
+ CAccPolMuteControl* speakermute =
+ CAccPolMuteControl::NewLC( KAccMasterChannel, ETrue );
+
+ FU2->AddControlL( *speakerRightVolume );
+ FU2->AddControlL( *speakerLeftVolume );
+ FU2->AddControlL( *speakermute );
+
+ //Connected to MU-8
+ aObject->AddL( *FU2 );
+
+ CAccPolMixerUnit* MU8 = CAccPolMixerUnit::NewLC( 8 );
+ MU8->AddSourceIdL( 1 );
+ MU8->AddSourceIdL( 7 );
+
+ //Connected to IT1 and FU7
+ aObject->AddL( *MU8 );
+
+ //Choice one
+ //IT-1
+ TUint8 aChannelCount = 2;
+ TUint16 aChannelConfig = 0;
+ aChannelConfig = aChannelConfig | KAccRightFrontChannel;
+ aChannelConfig = aChannelConfig | KAccLeftFrontChannel;
+
+ CAccPolInputTerminal* IT1 = CAccPolInputTerminal::NewLC( 1,
+ CAccPolInputTerminal::EAPTStream,
+ aChannelCount,
+ aChannelConfig );
+ aObject->AddL( *IT1 );
+
+ //choice two
+ //FU7
+ CAccPolFeatureUnit* FU7 = CAccPolFeatureUnit::NewLC( 7, 5 ); //Connected to FU5
+ // Volume control object.
+ CAccPolVolumeControl* sidetoneRightVolume =
+ CAccPolVolumeControl::NewLC( KAccMasterChannel, 7, 5, 20, 5 );
+ CAccPolVolumeControl* sidetoneLeftVolume =
+ CAccPolVolumeControl::NewLC( KAccMasterChannel, 7, 5, 20, 5 );
+
+ FU7->AddControlL( *sidetoneRightVolume );
+ FU7->AddControlL( *sidetoneLeftVolume );
+
+ aObject->AddL( *FU7 );
+
+ //Microphone
+ //IT-4
+
+ //OT-6
+ CAccPolOutputTerminal* OT6 = CAccPolOutputTerminal::NewLC( 6,
+ CAccPolOutputTerminal::EAPTStream,
+ 10 );
+ //Connected to SU-10
+ aObject->AddL( *OT6 );
+
+ //SU-10
+ CAccPolSelectorUnit* SU10 = CAccPolSelectorUnit::NewLC( 10, 1 );
+
+ // Connected to FU 5
+ SU10->AddSourceIdL( 5 );
+ aObject->AddL( *SU10 );
+
+ //FU5
+ CAccPolFeatureUnit* FU5 = CAccPolFeatureUnit::NewLC( 5, 9 );
+
+ // Volume control object.
+ CAccPolVolumeControl* micRightVolume =
+ CAccPolVolumeControl::NewLC( KAccRightFrontChannel, 7, 5, 20, 5 );
+ CAccPolVolumeControl* micLeftVolume =
+ CAccPolVolumeControl::NewLC( KAccLeftFrontChannel, 7, 5, 20, 5 );
+ CAccPolMuteControl* micmute = CAccPolMuteControl::NewLC( KAccMasterChannel,
+ ETrue );
+
+ FU5->AddControlL( *micRightVolume );
+ FU5->AddControlL( *micLeftVolume );
+ FU5->AddControlL( *micmute );
+
+ //Connected to FU-9
+ aObject->AddL( *FU5 );
+
+ ///FU9
+ CAccPolFeatureUnit* FU9 = CAccPolFeatureUnit::NewLC( 9, 4 );
+ //Connected IT-4
+ aObject->AddL( *FU9 );
+
+ CAccPolInputTerminal* IT4 = CAccPolInputTerminal::NewLC( 4,
+ CAccPolInputTerminal::EAPTMicrophone,
+ aChannelCount,
+ aChannelConfig );
+ aObject->AddL( *IT4 );
+
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ //Externalize container to buf
+ RBufWriteStream wStrm;
+ ( void )wStrm.Open( *buf );
+ wStrm.PushL();
+ aObject->ExternalizeL( wStrm );
+ wStrm.CommitL();
+ wStrm.Close();
+ wStrm.Pop();
+ TPtr8 ptr( buf->Ptr( 0 ) );
+ TInt retval = prop.Set( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ ptr );
+
+ // Notify ASY stub
+ if( aParameter.iArg2 )
+ {
+ PublishAndSubscribeL( aParameter );
+ }
+
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( IT4 );
+ CleanupStack::PopAndDestroy( FU9 );
+ CleanupStack::PopAndDestroy( micmute );
+ CleanupStack::PopAndDestroy( micLeftVolume );
+ CleanupStack::PopAndDestroy( micRightVolume );
+ CleanupStack::PopAndDestroy( FU5 );
+ CleanupStack::PopAndDestroy( SU10 );
+ CleanupStack::PopAndDestroy( OT6 );
+ CleanupStack::PopAndDestroy( sidetoneLeftVolume );
+ CleanupStack::PopAndDestroy( sidetoneRightVolume );
+ CleanupStack::PopAndDestroy( FU7 );
+ CleanupStack::PopAndDestroy( IT1 );
+ CleanupStack::PopAndDestroy( MU8 );
+ CleanupStack::PopAndDestroy( speakermute );
+ CleanupStack::PopAndDestroy( speakerLeftVolume );
+ CleanupStack::PopAndDestroy( speakerRightVolume );
+ CleanupStack::PopAndDestroy( FU2 );
+ CleanupStack::PopAndDestroy( OT3 );
+ CleanupStack::PopAndDestroy( aObject );
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CallAccessoryFunctionL
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::CallAccessoryFunctionL( TTFAccessoryTestCaseStateControl& aParameter )
+ {
+
+ // COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CallAccessoryFunctionL(%d, %d, %d)" ), aParameter.iAccessoryFunction, aParameter.iArg1, aParameter.iArg2 ) );
+ if( !iInitialized )
+ {
+ InitializeL();
+ }
+
+ TInt retval = KTFErrAccessoryServiceMissing;
+
+ switch( aParameter.iAccessoryFunction )
+ {
+ case ETFAccessorySet_ObjectPubSub:
+ {
+ CreateObjectPubSubL( ( TStreamConObjectType )aParameter.iArg1,
+ aParameter.iArg2,
+ ( TStreamConObjectType )aParameter.iArg3,
+ aParameter.iArg4 );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessorySet_TopologyObjectsPubSub:
+ {
+ CreateTopologyObjectsToPubSubL( aParameter );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessorySet_PubSub:
+ {
+ RProperty prop;
+ prop.Define( KTFAccessoryTestProperty,
+ KTFAccessoryNotifierMethod,
+ RProperty::EInt );
+ retval = prop.Set( KTFAccessoryTestProperty,
+ KTFAccessoryNotifierMethod,
+ aParameter.iArg1 );
+ }
+ break;
+
+ case ETFConnectWiredAccessory:
+ {
+ PublishAndSubscribeL( aParameter );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFClearStack:
+ {
+ CTFTestControlObserver* observerItem;
+ TInt count = 0;
+ if( !iStack.IsEmpty() )
+ {
+ iStackIter.SetToFirst();
+
+ while( ( observerItem = iStackIter++ ) != NULL )
+ {
+ observerItem->Cancel();
+ iStack.Remove( *observerItem );
+ delete observerItem;
+ count++;
+ };
+ }
+
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestCaseControl::ETF_Pappa - count=%d " ), count ) );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFDisconnectWiredAccessory:
+ {
+ retval = KErrNone;
+ PublishAndSubscribeL( aParameter );
+ TAccPolGenericID emptyInstance;
+ iGenericId[aParameter.iGid] = emptyInstance;
+ }
+ break;
+
+ case ETFCheckCapabilityGroup:
+ {
+ if( aParameter.iArg2
+ == iGenericId[aParameter.iGid].SubblockCaps( aParameter.iArg3 ) )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrNotFound;
+ }
+ }
+ break;
+
+ case ETFCheckCapability:
+ {
+ RAccessoryConnection accessoryConnectionn;
+ accessoryConnectionn.CreateSubSession( iAccessoryServer );
+
+ CAccPolSubblockNameArray* nameArrayy =
+ CAccPolSubblockNameArray::NewL();
+ CleanupStack::PushL( nameArrayy );
+ accessoryConnectionn.GetSubblockNameArrayL( iGenericId[aParameter.iGid],
+ *nameArrayy );
+
+ if( aParameter.iArg2 == nameArrayy->HasName( aParameter.iArg3 ) )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrNotFound;
+ }
+
+ CleanupStack::PopAndDestroy( nameArrayy );
+ accessoryConnectionn.CloseSubSession();
+ }
+ break;
+
+ case ETFFindAndCheckRequest:
+
+ {
+ FindAndCheckRequestL(&retval, aParameter);
+ }
+ break;
+
+ case ETFFindAndCheckObjectRequest:
+ {
+ CTFAccessoryTestCaseControl* testCase = STATIC_CAST( CTFAccessoryTestCaseControl*, CurrentTestCase());
+ TRACE_ASSERT( testCase != NULL );
+ if( testCase != NULL )
+ {
+ if( !iStack.IsEmpty() )
+ {
+ iStackIter.SetToFirst();
+
+ while( ( iObserverItem = iStackIter++ ) != NULL )
+ {
+ if( iObserverItem->FindRequest( aParameter.iRequestType ) )
+ {
+ testCase->CheckObjectRequest( iObserverItem->iStatus,
+ iObserverItem->iObjectValue,
+ iObserverItem->iCapabilityName );
+
+ if( !iStack.IsEmpty() ) // Check if observes are already deleted by CheckRequest()
+ {
+ if( KTFDontDeleteObserver != aParameter.iArg1 )
+ {
+ iStack.Remove( *iObserverItem );
+ delete iObserverItem;
+ return;
+ }
+ else
+ {
+ User::Leave( KTFDontDeleteObserver );
+ }
+ }
+ else
+ {
+ retval = KErrGeneral;
+ }
+ }
+ }
+ }
+ else
+ {
+ retval = KErrGeneral;
+ }
+ }
+
+ retval = KErrNone;
+ }
+ break;
+
+ //
+ // Accessory Connection
+ //
+ case ETFAccessoryConnection_Open:
+ {
+ AccessoryConnectionOpenClose(ETFAccessoryConnection_Open, &retval);
+ }
+ break;
+
+ case ETFAccessoryConnection_Close:
+
+ {
+ AccessoryConnectionOpenClose(ETFAccessoryConnection_Close, &retval);
+ }
+ break;
+
+ //
+ // Accessory Settings
+ //
+ case ETFAccessorySettings_Open:
+ {
+ AccessorySettingsOpenClose(ETFAccessorySettings_Open, &retval);
+ }
+ break;
+
+ case ETFAccessorySettings_Close:
+ {
+ AccessorySettingsOpenClose(ETFAccessorySettings_Close, &retval);
+ }
+ break;
+
+ case ETFSetHWDeviceSettings:
+ {
+ retval
+ = iAccessorySettings->SetHWDeviceSettingsL( aParameter.iArg1,
+ ( TBool )aParameter.iArg2 );
+ }
+ break;
+
+ case ETFGetHWDeviceSettings:
+ {
+ TUint32 aSettingsValue( 0 );
+ retval = iAccessorySettings->GetHWDeviceSettings( aSettingsValue );
+
+ if( aSettingsValue != aParameter.iArg1 )
+ {
+ retval = KErrArgument;
+ }
+ }
+ break;
+
+ case ETFGetSupportedHWDeviceSettings:
+ {
+ TUint32 aSettingsSupportedValue( 0 );
+
+ retval
+ = iAccessorySettings->GetSupportedHWDeviceSettings( aSettingsSupportedValue );
+
+ if( aSettingsSupportedValue != ( aParameter.iArg1
+ | aParameter.iArg2 ) )
+ {
+ retval = KErrArgument;
+ }
+ }
+ break;
+
+ case ETFSetIntAccessoryModeSetting:
+ {
+ TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
+ TAccModeSetting aSetting;
+
+ //Set Lights
+ aSetting.SetId( aParameter.iArg2 );
+ aSetting.SetTInt( aParameter.iArg4 );
+
+ retval = iAccessorySettings->SetAccessoryModeSettingL( aAccMode,
+ aSetting );
+ }
+ break;
+
+ case ETFSetBoolAccessoryModeSetting:
+ {
+ TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
+ TAccModeSetting aSetting;
+
+ //Set Lights
+ aSetting.SetId( aParameter.iArg2 );
+ aSetting.SetTBool( aParameter.iArg4 );
+
+ retval = iAccessorySettings->SetAccessoryModeSettingL( aAccMode,
+ aSetting );
+ }
+ break;
+
+ case ETFSetDesAccessoryModeSetting:
+ {
+ TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
+ TAccModeSetting aSetting;
+
+ TBuf<KMaxAccModeSetting> buf;
+ buf.Num( aParameter.iArg3 );
+ // buf.Copy( *aParameter.iArg3 );
+
+ aSetting.SetId( aParameter.iArg2 );
+ aSetting.SetTDes( buf );
+ retval = iAccessorySettings->SetAccessoryModeSettingL( aAccMode,
+ aSetting );
+ }
+ break;
+
+ case ETFGetIntAccessoryModeSetting:
+ {
+ TInt aSettingsValueInt;
+
+ TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
+ TAccModeSetting aSetting;
+ aSetting.SetId( aParameter.iArg2 );
+
+ retval = iAccessorySettings->GetAccessoryModeSetting( aAccMode,
+ aSetting );
+
+ if( aSetting.Type() == EAccModeSettingInt )
+ {
+ retval = aSetting.GetTInt( aSettingsValueInt );
+
+ if( retval != KErrNotFound )
+ {
+ if( aSettingsValueInt == aParameter.iArg4 )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ retval = KErrNotFound;
+ }
+ }
+ break;
+
+ case ETFGetBoolAccessoryModeSetting:
+ {
+ TBool aSettingsValueBool;
+
+ TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
+ TAccModeSetting aSetting;
+ aSetting.SetId( aParameter.iArg2 );
+
+ retval = iAccessorySettings->GetAccessoryModeSetting( aAccMode,
+ aSetting );
+
+ if( aSetting.Type() == EAccModeSettingBool )
+ {
+ retval = aSetting.GetTBool( aSettingsValueBool );
+
+ if( retval != KErrNotFound )
+ {
+ if( aSettingsValueBool == ( TBool )aParameter.iArg4 )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ retval = KErrNotFound;
+ }
+ }
+ break;
+
+ case ETFGetDesAccessoryModeSetting:
+ {
+ TBuf<KMaxAccModeSetting> aSettingsValueDes;
+
+ TAccMode aAccMode = ( TAccMode )aParameter.iArg1;
+ TAccModeSetting aSetting;
+ aSetting.SetId( aParameter.iArg2 );
+
+ retval = iAccessorySettings->GetAccessoryModeSetting( aAccMode,
+ aSetting );
+
+ if( aSetting.Type() == EAccModeSettingDes )
+ {
+ retval = aSetting.GetTDes( aSettingsValueDes );
+
+ if( retval != KErrNotFound )
+ {
+ TBuf<KMaxAccModeSetting> buffer;
+ buffer.Num( aParameter.iArg3 );
+ if( KErrNone == aSettingsValueDes.Compare( buffer ) )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ retval = KErrNotFound;
+ }
+ }
+ break;
+
+ case ETFSetSeveralAccessoryModeSetting:
+ {
+
+ TAccModeSetting accModeSettingIn;
+ TAccMode tAccMode = EAccModeWirelessHeadset;
+ TBuf<KMaxAccModeSetting> aDesIn;
+ // Set
+ // setting 1
+ accModeSettingIn.SetId( 11 ); // unknown TInt
+ accModeSettingIn.SetTInt( 1 );
+ TAccModeSettingArray arrayIn;
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 2
+ accModeSettingIn.SetId( 12 ); // unknown Des
+ _LIT( KAccSetting2, "012345678901234567890" );
+ aDesIn.Copy( KAccSetting2 );
+ accModeSettingIn.SetTDes( aDesIn );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 3
+ accModeSettingIn.SetId( 13 ); // unknown TBool
+ accModeSettingIn.SetTBool( ETrue );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ retval = iAccessorySettings->SetAccessoryModeSettingsL( tAccMode,
+ arrayIn );
+
+ }
+ break;
+
+ case ETFGetSeveralAccessoryModeSetting:
+ {
+
+ TAccModeSetting accModeSettingOut;
+ TAccMode tAccMode = EAccModeWirelessHeadset;
+ TBuf<KMaxAccModeSetting> aDesOut;
+ TAccModeSettingArray arrayOut;
+ TInt intOut( 0 );
+ // set input parameters for GetAccessoryModeSettings()
+ // setting 11
+ accModeSettingOut.SetId( 11 );
+ arrayOut.AddSetting( accModeSettingOut );
+
+ // setting 12
+ accModeSettingOut.SetId( 12 );
+ arrayOut.AddSetting( accModeSettingOut );
+
+ // setting 13
+ accModeSettingOut.SetId( 13 );
+ arrayOut.AddSetting( accModeSettingOut );
+
+ retval = iAccessorySettings->GetAccessoryModeSettings( tAccMode,
+ arrayOut );
+
+ // Check that got settings are right
+
+ TInt count = arrayOut.GetArraySize();
+ TInt foundCount( 0 );
+
+ for( TInt index = 0; index < count; index++ )
+ {
+ arrayOut.GetSetting( index, accModeSettingOut );
+
+ if( 11 == accModeSettingOut.Id() )
+ {
+
+ accModeSettingOut.GetTInt( intOut );
+
+ if( 1 == intOut )
+ {
+ foundCount++;
+ }
+ }
+
+ if( 12 == accModeSettingOut.Id() )
+ {
+ accModeSettingOut.GetTDes( aDesOut );
+
+ if( KErrNone == aDesOut.Compare( _L("012345678901234567890") ) )
+ {
+ foundCount++;
+ }
+
+ }
+
+ if( 13 == accModeSettingOut.Id() )
+ {
+
+ accModeSettingOut.GetTBool( intOut );
+
+ if( intOut )
+ {
+ foundCount++;
+ }
+ }
+ }
+
+ if( foundCount != 3 )
+ {
+ retval = KErrNotFound;
+ }
+
+ //
+ // Reset Settings
+ //
+ TAccModeSetting accModeSettingIn;
+ TBuf<KMaxAccModeSetting> aDesIn;
+ // Set
+ // setting 1
+ accModeSettingIn.SetId( 11 ); // unknown TInt
+ accModeSettingIn.SetTInt( 0 );
+ TAccModeSettingArray arrayIn;
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 2
+ accModeSettingIn.SetId( 12 ); // unknown Des
+ _LIT( KAccSetting2, "" );
+ aDesIn.Copy( KAccSetting2 );
+ accModeSettingIn.SetTDes( aDesIn );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 3
+ accModeSettingIn.SetId( 13 ); // unknown TBool
+ accModeSettingIn.SetTBool( EFalse );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ iAccessorySettings->SetAccessoryModeSettingsL( tAccMode, arrayIn );
+ }
+ break;
+
+ //
+ // Accessory Single Connection
+ //
+ case ETFAccessorySingleConnection_Open:
+ {
+ if( iAccessorySingleConnection == NULL )
+ {
+ iAccessorySingleConnection
+ = new ( ELeave ) RAccessorySingleConnection;
+ retval
+ = iAccessorySingleConnection->CreateSubSession( iAccessoryServer );
+ }
+ else
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessorySingleConnection_Close:
+ {
+ TRACE_ASSERT( iAccessorySingleConnection != NULL );
+
+ if( iAccessorySingleConnection != NULL )
+ {
+ iAccessorySingleConnection->CloseSubSession();
+ delete iAccessorySingleConnection;
+ iAccessorySingleConnection = NULL;
+ }
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryNotifyNewAccessoryConnected:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyNewAccessoryConnected( iGenericId[aParameter.iGid] );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryNotifyAccessoryDisconnected:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyAccessoryDisconnected( iGenericId[aParameter.iGid] );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFNotifyIntAccessoryValueChanged:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyIntegerAccessoryValueChanged( iGenericId[aParameter.iGid],
+ aParameter.iArg3 );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFNotifyBoolAccessoryValueChanged:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyBooleanAccessoryValueChanged( iGenericId[aParameter.iGid],
+ aParameter.iArg3 );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFNotifyObjectAccessoryValueChanged:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyObjectAccessoryValueChanged( iGenericId[aParameter.iGid],
+ aParameter.iArg3 );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryIntGetValue:
+ {
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TAccValueTypeTInt aIntValue;
+
+ iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid],
+ aNameRecord,
+ aIntValue );
+
+ if( aIntValue.iValue == aParameter.iArg2 )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrArgument;
+ }
+ }
+ break;
+
+ case ETFAccessoryBoolGetValue:
+ {
+ RAccessoryConnection accessoryConnection;
+ accessoryConnection.CreateSubSession( iAccessoryServer );
+
+ TAccPolNameRecord nameRecord;
+ nameRecord.SetNameL( aParameter.iArg3 );
+ TAccValueTypeTBool boolValue;
+ retval
+ = accessoryConnection.GetValueL( iGenericId[aParameter.iGid],
+ nameRecord,
+ boolValue );
+
+ if( boolValue.iValue != aParameter.iArg1 )
+ {
+ retval = KErrArgument;
+ }
+
+ accessoryConnection.CloseSubSession();
+ }
+ break;
+
+ case ETFAccessoryDes8GetValue:
+ {
+ TBuf8<80>
+ worm( _L8("Malicious Worm Attach with extra long data with extra long content" ));
+ TBuf8<85> valueBuf;
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg1 );
+ TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, valueBuf ) );
+
+ if( err == aParameter.iExpectedResult )
+ {
+
+ if( aParameter.iExpectedResult == KErrArgument )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ if( KErrNone == valueBuf.Compare( worm ) )
+ {
+ RDebug::RawPrint( valueBuf );
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ retval = KErrArgument;
+ }
+ }
+ break;
+
+ case ETFAccessoryObjectParseTopology:
+ {
+
+ TInt rspeaker( KErrGeneral );
+ TInt lspeaker( KErrGeneral );
+ TInt rmic( KErrGeneral );
+ TInt lmic( KErrGeneral );
+ TInt mute( KErrGeneral );
+ TInt sidetone( KErrGeneral );
+ //
+ // Find speaker volume object in USB headset case.
+ //
+ CAccPolAudioUnitBase* audioUnit = NULL;
+ CAccPolAudioControlBase* audioControl = NULL;
+ //CAccPolOutputTerminal* ouputTerminal = NULL;
+
+ if( iTopologyContainer->OutputTerminalL( CAccPolOutputTerminal::EAPTHeadphone,
+ audioUnit ) )
+ {
+ if( audioUnit->GetNextAudioUnitL( audioUnit ) )
+ {
+ if( audioUnit->ObjectType()
+ == EAccPolAudioFeatureUnitObject )
+ {
+ if( audioUnit->GetAudioControlL( EAccPolAudioVolumeControlObject,
+ KAccRightFrontChannel,
+ audioControl ) )
+ {
+ iSpeakerRightVolume = CAccPolVolumeControl::NewL();
+ *iSpeakerRightVolume
+ = *reinterpret_cast<CAccPolVolumeControl*> ( audioControl );
+ rspeaker = KErrNone;
+ }
+ if( audioUnit->GetAudioControlL( EAccPolAudioVolumeControlObject,
+ KAccLeftFrontChannel,
+ audioControl ) )
+ {
+ iSpeakerLeftVolume = CAccPolVolumeControl::NewL();
+ *iSpeakerLeftVolume
+ = *reinterpret_cast<CAccPolVolumeControl*> ( audioControl );
+ lspeaker = KErrNone;
+ }
+ if( audioUnit->GetAudioControlL( EAccPolAudioMuteControlObject,
+ KAccMasterChannel,
+ audioControl ) )
+ {
+ iSpeakerMute = CAccPolMuteControl::NewL();
+ *iSpeakerMute
+ = *reinterpret_cast<CAccPolMuteControl*> ( audioControl );
+ mute = KErrNone;
+ }
+
+ }
+ }
+ }
+
+ //
+ // Find mic volume object in USB headset case.
+ //
+ if( iTopologyContainer->OutputTerminalL( CAccPolOutputTerminal::EAPTStream,
+ audioUnit ) )
+ {
+ do
+ {
+ }
+ while( audioUnit->GetNextAudioUnitL( audioUnit )
+ && audioUnit->ObjectType() != EAccPolAudioFeatureUnitObject );
+
+ RPointerArray<CAccPolAudioControlBase> aAudioControls;
+ audioUnit->GetAudioControlsL( KAccRightFrontChannel,
+ aAudioControls );
+
+ if( aAudioControls.Count() > 0 )
+ {
+ iMicRightVolume = CAccPolVolumeControl::NewL();
+ *iMicRightVolume
+ = *reinterpret_cast<CAccPolVolumeControl*> ( aAudioControls.operator[]( 0 ) );
+ rmic = KErrNone;
+ }
+ aAudioControls.Reset();
+
+ audioUnit->GetAudioControlsL( KAccLeftFrontChannel,
+ aAudioControls );
+
+ if( aAudioControls.Count() > 0 )
+ {
+ iMicLeftVolume = CAccPolVolumeControl::NewL();
+ *iMicLeftVolume
+ = *reinterpret_cast<CAccPolVolumeControl*> ( aAudioControls.operator[]( 0 ) );
+ lmic = KErrNone;
+ }
+
+ //
+ // Find sidetone volume object in USB headset case.
+ //
+ iTopologyContainer->OutputTerminalL( CAccPolOutputTerminal::EAPTHeadphone,
+ audioUnit );
+
+ do
+ {
+ audioUnit->GetNextAudioUnitL( audioUnit );
+ }
+ while( audioUnit->ObjectType() != EAccPolAudioMixerUnitObject );
+
+ if( audioUnit->SourceIdCount() > 1 )
+ {
+ RPointerArray<CAccPolAudioUnitBase> aAudioUnits;
+ audioUnit->GetAudioUnitListL( aAudioUnits );
+
+ for( TInt i = 0; i < aAudioUnits.Count(); i++ )
+ {
+ if( aAudioUnits.operator[]( i )->ObjectType()
+ == EAccPolAudioFeatureUnitObject )
+ {
+ audioUnit = aAudioUnits.operator[]( i );
+ break;
+ }
+ }
+ }
+
+ aAudioControls.Reset();
+ audioUnit->GetAudioControlsL( aAudioControls );
+ if( aAudioControls.Count() == 2 )
+ {
+ sidetone = KErrNone;
+ }
+ }
+
+ retval = ( rspeaker | lspeaker | rmic | lmic | mute | sidetone );
+
+ }
+ break;
+
+ case ETFAccessoryGetStreamObjects:
+ {
+ if( iStreamContainer != NULL )
+ {
+ delete iStreamContainer;
+ iStreamContainer = NULL;
+ }
+ iStreamContainer = CAccPolAudioStreamFormatCon::NewL();
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iStreamContainer ) );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ //externalize container to bufFromASY
+ CBufFlat* bufFromASY =
+ CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( bufFromASY );
+ bufFromASY->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ RBufWriteStream wStrm;
+ ( void )wStrm.Open( *bufFromASY );
+ wStrm.PushL();
+ iStreamContainer->ExternalizeL( wStrm );
+ wStrm.CommitL();
+ wStrm.Close();
+ wStrm.Pop();
+ TPtr8 ptrbufFromASY( bufFromASY->Ptr( 0 ) );
+
+ //Read container from PubSub
+ RProperty prop;
+ RBufReadStream rStrm;
+ CBufFlat* bufFromPubSub =
+ CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( bufFromPubSub );
+ bufFromPubSub->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ TPtr8 ptrBufFromPubSub( bufFromPubSub->Ptr( 0 ) );
+ TInt ret = prop.Get( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ ptrBufFromPubSub );
+
+ TInt k = sizeof( bufFromASY );
+ TInt kk = sizeof( bufFromPubSub );
+
+ bufFromASY->Compress();
+ bufFromPubSub->Compress();
+
+ k = sizeof( bufFromASY );
+ kk = sizeof( bufFromPubSub );
+
+ retval
+ = ( 0
+ == memcompare( reinterpret_cast<TUint8*> ( &ptrbufFromASY ),
+ sizeof( bufFromASY ),
+ reinterpret_cast<TUint8*> ( &ptrBufFromPubSub ),
+ sizeof( bufFromASY ) ) ) ? KErrNone : KErrGeneral;
+
+ CleanupStack::PopAndDestroy( bufFromPubSub );
+ CleanupStack::PopAndDestroy( bufFromASY );
+ }
+ }
+ break;
+
+ case ETFAccessoryGetStreamObjectsFromPolicy:
+ {
+ if( iStreamContainer != NULL )
+ {
+ delete iStreamContainer;
+ iStreamContainer = NULL;
+ }
+ iStreamContainer = CAccPolAudioStreamFormatCon::NewL();
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iStreamContainer ) );
+
+ RPointerArray<CAccPolAudioStreamFormat> inputStreamObjects;
+ RPointerArray<CAccPolAudioStreamFormat> outputStreamObjects;
+
+ iStreamContainer->GetInputStreamFormatsL( inputStreamObjects );
+ iStreamContainer->GetOutputStreamFormatsL( outputStreamObjects );
+
+ CAccPolAudioStreamFormat* inputStream =
+ inputStreamObjects.operator[]( 0 );
+ CAccPolAudioStreamFormat* ouputStream =
+ outputStreamObjects.operator[]( 0 );
+
+ retval = err;
+ }
+ break;
+
+ case ETFAccessorySetStreamObjects:
+ {
+ CAccPolAudioStreamFormatCon* setContainer = CAccPolAudioStreamFormatCon::NewLC();
+
+ RPointerArray<CAccPolAudioStreamFormat> inputStreamObjects;
+ RPointerArray<CAccPolAudioStreamFormat> outputStreamObjects;
+
+ iStreamContainer->GetInputStreamFormatsL( inputStreamObjects );
+ CAccPolAudioStreamFormat* inputStream = NULL;
+ for(TInt i=0; i<inputStreamObjects.Count(); i++)
+ {
+ inputStream = inputStreamObjects.operator[]( i );
+ if( inputStream->AudioFormat() == KUidFormatPCM16 &&
+ inputStream->UnitId() == 0 &&
+ inputStream->StreamType() == CAccPolAudioStreamFormat::EStereo &&
+ inputStream->BitResolution() == CAccPolAudioStreamFormat::EBitsPerSample16 &&
+ inputStream->SamFreq() == 200 )
+ {
+ setContainer->AddL( *inputStream );
+ break;
+ }
+ }
+
+ iStreamContainer->GetOutputStreamFormatsL( outputStreamObjects );
+ CAccPolAudioStreamFormat* outputStream = NULL;
+ for(TInt i=0; i<outputStreamObjects.Count(); i++)
+ {
+ outputStream = outputStreamObjects.operator[]( i );
+ if( outputStream->AudioFormat() == KUidFormatPCM16 &&
+ outputStream->UnitId() == 0 &&
+ outputStream->StreamType() == CAccPolAudioStreamFormat::EMono &&
+ outputStream->BitResolution() == CAccPolAudioStreamFormat::EBitsPerSample32 &&
+ outputStream->SamFreq() == 200 )
+ {
+ setContainer->AddL( *outputStream );
+ break;
+ }
+ }
+
+ RBufWriteStream wStrm;
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ (void)wStrm.Open( *buf );
+ wStrm.PushL();
+ setContainer->ExternalizeL( wStrm );
+ wStrm.Close();
+ wStrm.Pop();
+ TPtr8 ptr( buf->Ptr( 0 ) );
+
+ retval = RProperty::Set( KTFAccessoryTestProperty, KTFAccessoryObjectMethod, ptr );
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+
+ TRAPD( setErr, iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, *setContainer ) );
+
+ retval = setErr;
+
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( setContainer );
+ inputStreamObjects.Close();
+ outputStreamObjects.Close();
+ }
+ break;
+
+ case ETFAccessoryGetTopologyObjects:
+ {
+ if( iTopologyContainer != NULL )
+ {
+ delete iTopologyContainer;
+ iTopologyContainer = NULL;
+ }
+
+ iTopologyContainer = CAccPolAudioTopologyObjectCon::NewL();
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iTopologyContainer ) );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ //externalize container to bufFromASY
+ CBufFlat* bufFromASY =
+ CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( bufFromASY );
+ bufFromASY->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ RBufWriteStream wStrm;
+ ( void )wStrm.Open( *bufFromASY );
+ wStrm.PushL();
+ iTopologyContainer->ExternalizeL( wStrm );
+ wStrm.CommitL();
+ wStrm.Close();
+ wStrm.Pop();
+ TPtr8 ptrbufFromASY( bufFromASY->Ptr( 0 ) );
+
+ //Read container from PubSub
+ RProperty prop;
+ RBufReadStream rStrm;
+ CBufFlat* bufFromPubSub =
+ CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( bufFromPubSub );
+ bufFromPubSub->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ TPtr8 ptrBufFromPubSub( bufFromPubSub->Ptr( 0 ) );
+ TInt ret = prop.Get( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ ptrBufFromPubSub );
+
+ TInt k = sizeof( bufFromASY );
+ TInt kk = sizeof( bufFromPubSub );
+
+ bufFromASY->Compress();
+ bufFromPubSub->Compress();
+
+ k = sizeof( bufFromASY );
+ kk = sizeof( bufFromPubSub );
+
+ retval
+ = ( 0
+ == memcompare( reinterpret_cast<TUint8*> ( &ptrbufFromASY ),
+ sizeof( bufFromASY ),
+ reinterpret_cast<TUint8*> ( &ptrBufFromPubSub ),
+ sizeof( bufFromASY ) ) ) ? KErrNone : KErrGeneral;
+
+ CleanupStack::PopAndDestroy( bufFromPubSub );
+ CleanupStack::PopAndDestroy( bufFromASY );
+ }
+ }
+ break;
+
+ case ETFAccessoryGetVolumeControlObjects:
+ {
+
+ if( iTopologyContainer != NULL )
+ {
+ delete iTopologyContainer;
+ iTopologyContainer = NULL;
+ }
+
+ iTopologyContainer = CAccPolAudioTopologyObjectCon::NewL();
+
+ iTopologyContainer->AddL( *iSpeakerRightVolume );
+ iTopologyContainer->AddL( *iSpeakerLeftVolume );
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iTopologyContainer ) );
+
+ CAccPolVolumeControl* rightVolume;
+ rightVolume = ( CAccPolVolumeControl* )iTopologyContainer->AtL( 0 );
+
+ CAccPolVolumeControl* leftVolume;
+ leftVolume = ( CAccPolVolumeControl* )iTopologyContainer->AtL( 1 );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessorySetVolumeControlObjects:
+ {
+ RBufWriteStream wStrm;
+ CAccPolAudioTopologyObjectCon* setContainer =
+ CAccPolAudioTopologyObjectCon::NewLC();
+
+ iSpeakerRightVolume->SetVolumeDb( aParameter.iArg1 );
+ iSpeakerRightVolume->SetMinVolumeDb( aParameter.iArg2 );
+ iSpeakerRightVolume->SetMaxVolumeDb( aParameter.iArg4 );
+ iSpeakerRightVolume->SetVolumeResDb( 0x05 );
+ setContainer->AddL( *iSpeakerRightVolume );
+ iSpeakerLeftVolume->SetVolumeDb( aParameter.iArg1 );
+ iSpeakerLeftVolume->SetMinVolumeDb( aParameter.iArg2 );
+ iSpeakerLeftVolume->SetMaxVolumeDb( aParameter.iArg4 );
+ iSpeakerLeftVolume->SetVolumeResDb( 0x05 );
+ setContainer->AddL( *iSpeakerLeftVolume );
+
+ CBufFlat* buf =
+ CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ ( void )wStrm.Open( *buf );
+ wStrm.PushL();
+ setContainer->ExternalizeL( wStrm );
+ wStrm.Close();
+ wStrm.Pop();
+ TPtr8 ptr( buf->Ptr( 0 ) );
+
+ retval = RProperty::Set( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ ptr );
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TRAPD( setErr, iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, *setContainer ) );
+
+ retval = setErr;
+
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( setContainer );
+ }
+ break;
+
+ case ETFAccessoryGetMuteControlObjects:
+ {
+
+ if( iTopologyContainer != NULL )
+ {
+ delete iTopologyContainer;
+ iTopologyContainer = NULL;
+ }
+
+ iTopologyContainer = CAccPolAudioTopologyObjectCon::NewL();
+
+ iTopologyContainer->AddL( *iSpeakerMute );
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TRAPD( err, iAccessorySingleConnection->GetValueL( iGenericId[aParameter.iGid], aNameRecord, *iTopologyContainer ) );
+
+ CAccPolMuteControl* mute;
+ mute = ( CAccPolMuteControl* )iTopologyContainer->AtL( 0 );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessorySetMuteControlObjects:
+ {
+ RBufWriteStream wStrm;
+ CAccPolAudioTopologyObjectCon* setContainer =
+ CAccPolAudioTopologyObjectCon::NewLC();
+
+ iSpeakerMute->SetMute( aParameter.iArg1 );
+ setContainer->AddL( *iSpeakerMute );
+
+ CBufFlat* buf =
+ CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ ( void )wStrm.Open( *buf );
+ wStrm.PushL();
+ setContainer->ExternalizeL( wStrm );
+ wStrm.Close();
+ wStrm.Pop();
+ TPtr8 ptr( buf->Ptr( 0 ) );
+
+ retval = RProperty::Set( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ ptr );
+
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TRAPD( setErr, iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, *setContainer ) );
+
+ retval = setErr;
+
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( setContainer );
+ }
+ break;
+
+ //
+ // Accessory Control
+ //
+
+ case ETFAccessoryControl_Open:
+ {
+ if( iAccessoryControl == NULL )
+ {
+ iAccessoryControl = new ( ELeave ) RAccessoryControl;
+ retval = iAccessoryControl->CreateSubSession( iAccessoryServer );
+ }
+ else
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessoryControl_Close:
+ {
+ TRACE_ASSERT( iAccessoryControl != NULL );
+
+ if( iAccessoryControl != NULL )
+ {
+ iAccessoryControl->CloseSubSession();
+ delete iAccessoryControl;
+ iAccessoryControl = NULL;
+ }
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryNotifyAccessoryConnectionStatusChanged:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyAccessoryConnectionStatusChanged( iGenericIdArray );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFSyncGetAccessoryConnectionStatus:
+ {
+ iAccessoryConnection->GetAccessoryConnectionStatus( iGenericIdArray );
+
+ if( iGenericIdArray.Count() != aParameter.iArg1 )
+ {
+ retval = KErrArgument;
+ }
+ else
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFASyncGetAccessoryConnectionStatus:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->GetAccessoryConnectionStatus( iGenericIdArray );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFSetIntValue:
+ {
+ SetIntValue(aParameter, &retval);
+ }
+ break;
+
+ case ETFSetBoolValue:
+ {
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TAccValueTypeTBool aBoolValue;
+ aBoolValue.iValue = aParameter.iArg1;
+ retval = iAccessoryControl->SetValueL( iGenericId[aParameter.iGid],
+ aNameRecord,
+ aBoolValue );
+ }
+ break;
+
+ //
+ //Tuupaa
+ //
+ case ETFAccessoryValueChangedNotifyInt:
+ {
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( KAccAudioOutputType );
+ TAccValueTypeTInt aIntValue;
+ aIntValue.iValue = EAccAudioOutPutTypePublic;
+ iAccessoryControl->AccessoryValueChangedNotifyL( iGenericId[aParameter.iGid],
+ aNameRecord,
+ aIntValue );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryValueChangedNotifyBool:
+ {
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TAccValueTypeTBool aBoolValue;
+ aBoolValue.iValue = ETrue;
+ iAccessoryControl->AccessoryValueChangedNotifyL( iGenericId[aParameter.iGid],
+ aNameRecord,
+ aBoolValue );
+ retval = KErrNone;
+ }
+ break;
+
+ //
+ // BT Control
+ //
+ case ETFBTAccessoryValueChangedNotifyBool:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ TAccPolNameRecord nameRecord;
+ nameRecord.SetNameL( aParameter.iArg3 );
+ TAccValueTypeTBool boolValue;
+ boolValue.iValue = aParameter.iArg4;
+ iAccessoryBTControl->AccessoryValueChangedNotifyL( btaddr,
+ nameRecord,
+ boolValue );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFBTAccessoryValueChangedNotifyInt:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ TAccPolNameRecord nameRecord;
+ nameRecord.SetNameL( aParameter.iArg3 );
+ TAccValueTypeTInt intValue;
+ intValue.iValue = aParameter.iArg4;
+ iAccessoryBTControl->AccessoryValueChangedNotifyL( btaddr,
+ nameRecord,
+ intValue );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryBtControl_Open:
+ {
+ if( iAccessoryBTControl == NULL )
+ {
+ iAccessoryBTControl = new ( ELeave ) RAccessoryBTControl;
+ retval
+ = iAccessoryBTControl->CreateSubSession( iAccessoryServer );
+ }
+ else
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessoryBtControl_Close:
+ {
+ TRACE_ASSERT( iAccessoryBTControl != NULL );
+
+ if( iAccessoryBTControl != NULL )
+ {
+ iAccessoryBTControl->CloseSubSession();
+ delete iAccessoryBTControl;
+ iAccessoryBTControl = NULL;
+ }
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryBtConnectAccessory:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->ConnectBTAccessory( btaddr );
+ retval = KErrNone;
+ }
+ break;
+ case ETFAccessoryBtDisconnectAccessory:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ TRequestStatus status;
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->DisconnectBTAccessory( btaddr );
+ retval = KErrNone;
+ TAccPolGenericID emptyInstance;
+ iGenericId[aParameter.iGid] = emptyInstance;
+ }
+ break;
+
+ case ETFAccessoryNotifyBluetoothAudioLinkOpenReq:
+ {
+ //TRequestStatus status;
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyBluetoothAudioLinkOpenReq();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryBluetoothAudioLinkOpenedNotify:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkOpenedNotifyL( btaddr, (TAccAudioType)aParameter.iArg3 ) );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrGeneral;
+ }
+ }
+ break;
+
+ case ETFAccessoryBluetoothAudioLinkOpenResp:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ TInt response( aParameter.iArg2 );
+ TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkOpenRespL( btaddr, response ) );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrGeneral;
+ }
+ }
+ break;
+
+ case ETFAccessoryNotifyBluetoothAudioLinkCloseReq:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyBluetoothAudioLinkCloseReq();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryBluetoothAudioLinkClosedNotify:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkClosedNotifyL( btaddr, ( TAccAudioType )aParameter.iArg3 ) );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrGeneral;
+ }
+ }
+ break;
+
+ case ETFAccessoryBluetoothAudioLinkCloseResp:
+ {
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ TInt response( aParameter.iArg2 );
+ TRAPD( err, iAccessoryBTControl->BluetoothAudioLinkCloseRespL( btaddr, response ) );
+
+ if( err == aParameter.iExpectedResult )
+ {
+ retval = KErrNone;
+ }
+ else
+ {
+ retval = KErrGeneral;
+ }
+ }
+ break;
+
+ case ETFAccessoryBtCancelConnectAccessory:
+ {
+ TRequestStatus status;
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ iAccessoryBTControl->ConnectAccessory( status, btaddr );
+ iAccessoryBTControl->CancelConnectAccessory();
+ User::WaitForRequest( status );
+ if( KErrCancel != status.Int() )
+ {
+ retval = status.Int();
+ }
+ else
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessoryBtCancelDisconnectAccessory:
+ {
+ TRequestStatus status;
+ TBTDevAddr btaddr( aParameter.iArg1 );
+ iAccessoryBTControl->DisconnectAccessory( status, btaddr );
+ iAccessoryBTControl->CancelDisconnectAccessory();
+ User::WaitForRequest( status );
+ retval = status.Int();
+ }
+ break;
+
+ //
+ // Accessory Mode
+ //
+ case ETFAccessoryMode_Open:
+ {
+ if( iAccessoryMode == NULL )
+ {
+ iAccessoryMode = new ( ELeave ) RAccessoryMode;
+ retval = iAccessoryMode->CreateSubSession( iAccessoryServer );
+ }
+ else
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessoryMode_Close:
+ {
+ TRACE_ASSERT( iAccessoryMode != NULL );
+
+ if( iAccessoryMode != NULL )
+ {
+ iAccessoryMode->CloseSubSession();
+ delete iAccessoryMode;
+ iAccessoryMode = NULL;
+ }
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryNotifyAccessoryModeChanged:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyAccessoryModeChanged();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryAccessoryModeSync:
+ {
+ TAccPolAccessoryMode mode;
+ retval = iAccessoryMode->GetAccessoryMode( mode );
+
+ if( retval == KErrNone )
+ {
+ if( aParameter.iArg1 != mode.iAccessoryMode )
+ {
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Unexpected Accessory Mode Parameter1 %d %d" ), aParameter.iArg1, mode.iAccessoryMode ) );
+ retval = KTFErrAccessoryUnexpectedArg1;
+ }
+#ifdef __WINS__ // Just check this in winscw
+ if( aParameter.iArg2 != mode.iAudioOutputStatus )
+ {
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Unexpected Accessory Mode Parameter2 %d %d" ), aParameter.iArg2, mode.iAudioOutputStatus ) );
+ retval = KTFErrAccessoryUnexpectedArg2;
+ }
+#endif
+ }
+ else
+ {
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Getting Accessory Mode Failed %d" ), retval ) );
+ }
+
+ }
+ break;
+
+ case ETFAccessoryAccessoryModeASync:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->GetAccessoryMode();
+ retval = KErrNone;
+ }
+ break;
+
+ //
+ // Audio Control
+ //
+ case ETFAccessoryAudioControl_Open:
+ {
+ if( iAccessoryAudioControl == NULL )
+ {
+ iAccessoryAudioControl = new ( ELeave ) RAccessoryAudioControl;
+ retval
+ = iAccessoryAudioControl->CreateSubSession( iAccessoryServer );
+ }
+ else
+ {
+ retval = KErrNone;
+ }
+ }
+ break;
+
+ case ETFAccessoryAudioControl_Close:
+ {
+ TRACE_ASSERT( iAccessoryAudioControl != NULL );
+
+ if( iAccessoryAudioControl != NULL )
+ {
+ iAccessoryAudioControl->CloseSubSession();
+ delete iAccessoryAudioControl;
+ iAccessoryAudioControl = NULL;
+ }
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAudioRoutingStatusNotify:
+ {
+ RAccessoryAudioControl audioControl;
+ audioControl.CreateSubSession( iAccessoryServer );
+
+ audioControl.AudioRoutingStatusNotify( aParameter.iArg1,
+ iGenericId[aParameter.iGid] );
+ retval = KErrNone;
+
+ audioControl.CloseSubSession();
+ }
+ break;
+
+ case ETFAccessoryAudioLinkOpen:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->AccessoryAudioLinkOpen( iGenericId[aParameter.iGid],
+ aParameter.iArg3 );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryNotifyAccessoryAudioLinkOpened:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyAccessoryAudioLinkOpened( iGenericId[aParameter.iGid] );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryNotifyAccessoryAudioLinkClosed:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->NotifyAccessoryAudioLinkClosed( iGenericId[aParameter.iGid] );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryAccessoryAudioLinkClose:
+ {
+ CTFTestControlObserver* aConnectionObserver = CreateObserver();
+ TRACE_ASSERT( aConnectionObserver != NULL );
+ aConnectionObserver->AccessoryAudioLinkClose( iGenericId[aParameter.iGid],
+ aParameter.iArg3 );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessoryPublishAndSubscribe:
+ {
+ PublishAndSubscribeL( aParameter );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFAccessory_Cancel:
+ {
+ CTFTestControlObserver* item;
+ if( !iStack.IsEmpty() )
+ {
+ item = iStack.First();
+ item->Cancel();
+ }
+ retval = KErrNone;
+ }
+ break;
+
+ //
+ // Cancels
+ //
+ case ETFCancelAccessoryAudioLinkOpen:
+ {
+ iAccessoryAudioControl->CancelAccessoryAudioLinkOpen();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelAccessoryAudioLinkClose:
+ {
+ iAccessoryAudioControl->CancelAccessoryAudioLinkClose();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyAccessoryAudioLinkOpened:
+ {
+ iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkOpened();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyAccessoryAudioLinkClosed:
+ {
+ iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkClosed();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyProcessCommand:
+ {
+ TRACE_ASSERT_ALWAYS;
+ }
+ break;
+
+ case ETFCancelConnectAccessory:
+ {
+ iAccessoryControl->CancelConnectAccessory();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelDisconnectAccessory:
+ {
+ iAccessoryControl->CancelDisconnectAccessory();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyBluetoothAudioLinkOpenReq:
+ {
+ iAccessoryBTControl->CancelNotifyBluetoothAudioLinkOpenReq();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyBluetoothAudioLinkCloseReq:
+ {
+ iAccessoryBTControl->CancelNotifyBluetoothAudioLinkCloseReq();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyAccessoryConnectionStatusChanged:
+ {
+ iAccessoryConnection->CancelNotifyAccessoryConnectionStatusChanged();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelGetAccessoryConnectionStatus:
+ {
+ iAccessoryConnection->CancelGetAccessoryConnectionStatus();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelConnectAccessoryBT:
+ {
+ iAccessoryBTControl->CancelConnectAccessory();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelDisconnectAccessoryBT:
+ {
+ iAccessoryBTControl->CancelDisconnectAccessory();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyAccessoryModeChanged:
+ {
+ iAccessoryMode->CancelNotifyAccessoryModeChanged();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelGetAccessoryMode:
+ {
+ iAccessoryMode->CancelGetAccessoryMode();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyNewAccessoryConnected:
+ {
+ iAccessorySingleConnection->CancelNotifyNewAccessoryConnected();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyAccessoryDisconnected:
+ {
+ iAccessorySingleConnection->CancelNotifyAccessoryDisconnected();
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFCancelNotifyAccessoryValueChanged:
+ {
+ TAccPolNameRecord nameRecord;
+ nameRecord.SetNameL( aParameter.iArg3 );
+ iAccessorySingleConnection->CancelNotifyAccessoryValueChanged( nameRecord );
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFSelectionDialogText:
+ {
+ SelectionDialog(ETFSelectionDialogText, &retval);
+ }
+ break;
+
+ case ETFSelectionDialogCancel:
+ {
+ SelectionDialog(ETFSelectionDialogCancel, &retval);
+ }
+ break;
+
+ case ETFNotSupportedNote:
+ {
+ TUid KAccFwUiNoteNotifierUid =
+ {
+ 0x10205061
+ };
+ RNotifier notifier;
+ notifier.Connect();
+
+ TInt err = notifier.StartNotifier( KAccFwUiNoteNotifierUid,
+ KNullDesC8 );
+
+ TInt value( 0 );
+ TPckg<TInt> intPckg( value );
+ notifier.Close();
+
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ value = 1;
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ value = value << 1;
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ value = value << 1;
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ value = value << 1;
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ value = value << 1;
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ value = value << 1;
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ value = value << 1;
+ notifier.Connect();
+ err = notifier.StartNotifier( KAccFwUiNoteNotifierUid, intPckg );
+ notifier.Close();
+
+ retval = KErrNone;
+ }
+ break;
+
+ case ETFValueRecordTests:
+ {
+ retval = TestValueRecordL();
+ }
+ break;
+
+ case ETFObjectBaseSerializationTests:
+ {
+ retval = TestBaseSerializationL();
+ }
+ break;
+
+ case ETFCheckConnectedAccessory:
+ {
+ CheckConnectedAccessory(&retval);
+ }
+ break;
+
+ case ETFCallTClassMethods:
+ {
+ CallTClassMethods(&retval); \
+ }
+
+ case ETFSetHdmiObject_PubSub:
+ {
+ CreateHdmiObjectsToPubSubL( aParameter );
+ retval = KErrNone;
+ break;
+ }
+
+ case ETFGetHdmiObject:
+ {
+ TInt err = KErrNone;
+ TAccPolNameRecord nameRecord;
+ nameRecord.SetNameL( aParameter.iArg3 );
+
+ // Create HDMI container
+ CAccPolHdmiObjectCon* conFromASY = CAccPolHdmiObjectCon::NewLC();
+ CAccPolHdmiObjectCon* conFromPS = CAccPolHdmiObjectCon::NewLC();
+
+ // Get HDMI container
+ TRAP( err, iAccessorySingleConnection->GetValueL(
+ iGenericId[aParameter.iGid], nameRecord, *conFromASY ) );
+
+ // Get HDMI container from P&S
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ TPtr8 bufPtr( buf->Ptr( 0 ) );
+ err = RProperty::Get( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ bufPtr );
+ if( err == KErrNone )
+ {
+ RBufReadStream readStream( *buf );
+ readStream.PushL();
+ conFromPS->InternalizeL( readStream );
+ CleanupStack::PopAndDestroy( &readStream );
+ }
+ switch( aParameter.iArg3 )
+ {
+ case KAccVideoHdmiAttributes:
+ {
+ // Validate object count
+ if( conFromASY->Count() != conFromPS->Count() )
+ {
+ err = KErrArgument;
+ }
+
+ // Validate speaker allocation
+ RAccPolHdmiSpeakerAllocationArray array;
+ CleanupClosePushL( array );
+ conFromASY->GetHdmiSpeakerAllocationObjectsL( array );
+ if( array.Count() )
+ {
+ CAccPolHdmiSpeakerAllocation* speakerAllocation = array[0];
+ TUint32 bits = speakerAllocation->SpeakerAllocation();
+
+ // Speaker allocation should be EHdmiSpeakerUnknown
+ if( bits != CAccPolHdmiSpeakerAllocation::EHdmiSpeakerUnknown )
+ {
+ err = KErrArgument;
+ }
+
+ // Speaker count should be zero
+ if( speakerAllocation->SpeakerCount() )
+ {
+ err = KErrArgument;
+ }
+ }
+ CleanupStack::PopAndDestroy( &array );
+ break;
+ }
+ case KAccVideoFormat:
+ {
+ // Validate object count
+ if( conFromASY->Count() != conFromPS->Count() )
+ {
+ err = KErrArgument;
+ }
+
+ // Validate video format
+ RAccPolHdmiVideoFormatArray array;
+ CleanupClosePushL( array );
+ conFromASY->GetHdmiVideoFormatObjectsL( array );
+ if( array.Count() )
+ {
+ CAccPolHdmiVideoFormat* videoFormat = array[0];
+
+ // Interlaced video should be enabled
+ if( !videoFormat->Interlaced() )
+ {
+ err = KErrArgument;
+ }
+ }
+ else
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( &array );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( conFromPS );
+ CleanupStack::PopAndDestroy( conFromASY );
+ retval = err;
+ break;
+ }
+
+ case ETFCheckHdmiObject:
+ {
+ TInt err = KErrNone;
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Check HDMI object %d" ),
+ aParameter.iArg1 ) );
+ switch( aParameter.iArg1 )
+ {
+ case EAccPolHdmiObjectCon:
+ {
+ err = CheckHdmiContainerObjectL();
+ break;
+ }
+ case EAccPolHdmiSinkObject:
+ {
+ err = CheckHdmiSinkObjectL();
+ break;
+ }
+ case EAccPolHdmiAudioFormatObject:
+ {
+ err = CheckHdmiAudioFormatObjectL();
+ break;
+ }
+ case EAccPolHdmiLatencyObject:
+ {
+ err = CheckHdmiLatencyObjectL();
+ break;
+ }
+ case EAccPolHdmiSpeakerAllocationObject:
+ {
+ err = CheckHdmiSpeakerAllocationObjectL();
+ break;
+ }
+ case EAccPolHdmiVideoFormatObject:
+ {
+ err = CheckHdmiVideoFormatObjectL();
+ break;
+ }
+ default:
+ {
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Invalid HDMI object=%d" ),
+ aParameter.iArg1 ) );
+ err = KErrArgument;
+ break;
+ }
+ }
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL: Check HDMI object %d returned with code %d" ),
+ aParameter.iArg1, err ) );
+ retval = err;
+ break;
+ }
+
+ default:
+ TRACE_ASSERT_ALWAYS;
+ break;
+
+ }
+ User::LeaveIfError( retval );
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::TestValueRecordL()
+// ----------------------------------------------------------------------------------
+//
+TInt CTFAccessoryTestControl::TestValueRecordL()
+ {
+ TInt ret( KErrNone );
+
+ TAccPolValueRecord valueRecord;
+ TBuf8<KAccMaxECIBlockLength> eci;
+ TBuf8<KAccMaxECIBlockLength> check;
+ _LIT( Kissa, "Kissa" );
+ eci.Copy( Kissa );
+
+ valueRecord.SetValue( eci );
+ check.Copy( valueRecord.ValueRef() );
+
+ if( KErrNone != eci.Compare( check ) )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ TDesC8& test( valueRecord.ValueRef() );
+ if( KErrNone != eci.Compare( test ) )
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ return ret;
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::TestBaseSerializationL()
+// ----------------------------------------------------------------------------------
+//
+TInt CTFAccessoryTestControl::TestBaseSerializationL()
+ {
+ TInt ret( KErrNone );
+ TInt err( KErrNone );
+
+ /*** One container *************************************************************/
+ CAccPolAudioStreamFormatCon* container1 =
+ CAccPolAudioStreamFormatCon::NewLC();
+ CAccPolAudioStreamFormatCon* container2 =
+ CAccPolAudioStreamFormatCon::NewLC();
+
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ //Externalize to buf
+ RBufWriteStream wStrm;
+ ( void )wStrm.Open( *buf );
+ wStrm.PushL();
+ container1->ExternalizeL( wStrm );
+ wStrm.CommitL();
+ wStrm.Close();
+ wStrm.Pop();
+
+ //Internalize from buf
+ RBufReadStream rStrm;
+ ( void )rStrm.Open( *buf );
+ rStrm.PushL();
+ container2->InternalizeL( rStrm );
+ rStrm.Close();
+ rStrm.Pop();
+
+ //container1 content must equal to container2 content
+ err = ( 0 == memcompare( reinterpret_cast<TUint8*> ( container1 ),
+ sizeof(CAccPolObjectCon),
+ reinterpret_cast<TUint8*> ( container2 ),
+ sizeof(CAccPolObjectCon) ) ) ? KErrNone : KErrGeneral;
+ User::LeaveIfError( err );
+
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( container2 );
+ CleanupStack::PopAndDestroy( container1 );
+ container2 = NULL;
+ container1 = NULL;
+ /* end *************************************************************************/
+
+ //Make test again!
+
+ CAccPolAudioStreamFormat* audioStream1 =
+ CAccPolAudioStreamFormat::NewLC( EAccPolAudioInputStreamObject,
+ 15,
+ KUidFormatMP3,
+ CAccPolAudioStreamFormat::EStereo,
+ CAccPolAudioStreamFormat::EBitsPerSample24,
+ 11 );
+
+ buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ //Externalize to buf
+ ( void )wStrm.Open( *buf );
+ wStrm.PushL();
+ audioStream1->ExternalizeL( wStrm );
+ wStrm.CommitL();
+ wStrm.Close();
+ wStrm.Pop();
+
+ //Internalize from buf
+ ( void )rStrm.Open( *buf );
+ rStrm.PushL();
+
+ TInt objectid = rStrm.ReadUint8L();
+
+ if( ( TStreamConObjectType )objectid == EAccPolAudioInputStreamObject )
+ {
+ CAccPolAudioStreamFormat* audioStream2 =
+ CAccPolAudioStreamFormat::NewLC( EAccPolAudioInputStreamObject );
+
+ audioStream2->InternalizeL( rStrm );
+
+ //audioStream1 content must equal to audioStream2 content
+ err = ( 0 == memcompare( reinterpret_cast<TUint8*> ( audioStream1 ),
+ sizeof(CAccPolAudioStreamFormat),
+ reinterpret_cast<TUint8*> ( audioStream2 ),
+ sizeof(CAccPolAudioStreamFormat) ) ) ? KErrNone : KErrGeneral;
+
+ User::LeaveIfError( err );
+
+ CleanupStack::PopAndDestroy( audioStream2 );
+
+ rStrm.Close();
+ rStrm.Pop();
+
+ }
+ else
+ {
+ User::LeaveIfError( KErrGeneral );
+ }
+
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( audioStream1 );
+ audioStream1 = NULL;
+ /* end *************************************************************************/
+
+ return ret;
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::PublishAndSubscribeL()
+// ----------------------------------------------------------------------------------
+//
+void CTFAccessoryTestControl::PublishAndSubscribeL( TTFAccessoryTestCaseStateControl& aParameter )
+ {
+ TPckgBuf<TTFAccessoryPublishAndSubscribe> buf;
+
+ buf().iTestCaseID = aParameter.iTestCaseID;
+ buf().iMethod = aParameter.iMethod;
+ buf().iParam1 = aParameter.iArg1;
+ buf().iTimeMs = aParameter.iArg4;
+ buf().iGenericID = iGenericId[aParameter.iGid];
+
+ // Send capability to stub(s).
+
+ // if( aParameter.iArg3 )
+ // {
+ buf().iParam2 = aParameter.iArg3;
+ // }
+
+ /*
+ if( aParameter.iArg3->Compare( KNullDesC ) )
+ {
+ buf().iParam2.Copy( *aParameter.iArg3 );
+ }
+
+ */
+ User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty,
+ KTFAccessoryMethod,
+ buf ) );
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CreateHdmiObjectsToPubSubL()
+// ----------------------------------------------------------------------------------
+//
+void CTFAccessoryTestControl::CreateHdmiObjectsToPubSubL(
+ TTFAccessoryTestCaseStateControl& aParameter )
+ {
+ // Define property just in case
+ RProperty::Define( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ RProperty::EByteArray );
+
+ // Create HDMI container
+ CAccPolHdmiObjectCon* con = CAccPolHdmiObjectCon::NewLC();
+ switch( aParameter.iArg3 )
+ {
+ case KAccVideoHdmiAttributes:
+ {
+ // Create audio format object
+ CreateHdmiObjectL( *con, EAccPolHdmiAudioFormatObject );
+
+ // Create latency object
+ CreateHdmiObjectL( *con, EAccPolHdmiLatencyObject );
+
+ // Create sink object
+ CreateHdmiObjectL( *con, EAccPolHdmiSinkObject );
+
+ // Create speaker allocation object
+ CreateHdmiObjectL( *con, EAccPolHdmiSpeakerAllocationObject );
+
+ // Create video format object
+ CreateHdmiObjectL( *con, EAccPolHdmiVideoFormatObject );
+ break;
+ }
+ case KAccVideoFormat:
+ {
+ // Create video format object
+ CreateHdmiObjectL( *con, EAccPolHdmiVideoFormatObject );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ // Stream HDMI container to P&S
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ RBufWriteStream writeStream( *buf );
+ writeStream.PushL();
+ con->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ TPtr8 bufPtr( buf->Ptr( 0 ) );
+ TInt err = RProperty::Set( KTFAccessoryTestProperty,
+ KTFAccessoryObjectMethod,
+ bufPtr );
+ User::LeaveIfError( err );
+
+ // Check if ASY stub needs to be informed
+ if( aParameter.iArg2 )
+ {
+ PublishAndSubscribeL( aParameter );
+ }
+
+ // Cleanup
+ CleanupStack::PopAndDestroy( buf );
+ CleanupStack::PopAndDestroy( con );
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CheckHdmiContainerObjectL
+// ----------------------------------------------------------------------------------
+TInt CTFAccessoryTestControl::CheckHdmiContainerObjectL()
+ {
+ TInt err = KErrNone;
+ CAccPolHdmiObjectCon* con1 = NULL;
+ CAccPolHdmiObjectCon* con2 = NULL;
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ // NewL
+ con1 = CAccPolHdmiObjectCon::NewL();
+ CleanupStack::PushL( con1 );
+ CleanupStack::PopAndDestroy( con1 );
+
+ // NewLC
+ con1 = CAccPolHdmiObjectCon::NewLC();
+ CleanupStack::PopAndDestroy( con1 );
+
+ // Internalize & Externalize
+ con1 = CAccPolHdmiObjectCon::NewLC();
+ CreateHdmiObjectL( *con1, EAccPolHdmiAudioFormatObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiLatencyObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiSinkObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiSpeakerAllocationObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiVideoFormatObject );
+ RBufWriteStream writeStream;
+ writeStream.Open( *buf );
+ writeStream.PushL();
+ con1->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ con2 = CAccPolHdmiObjectCon::NewLC();
+ RBufReadStream readStream;
+ readStream.Open( *buf );
+ readStream.PushL();
+ con2->InternalizeL( readStream );
+ if( con1->Count() == con2->Count() )
+ {
+ TInt count = con1->Count();
+ CAccPolObjectBase* objBase1 = NULL;
+ CAccPolObjectBase* objBase2 = NULL;
+ for( TInt i = 0; i < count; i++ )
+ {
+ objBase1 = con1->AtL( i );
+ objBase2 = con2->AtL( i );
+ if( objBase1->ObjectType() != objBase2->ObjectType() )
+ {
+ err = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy( con2 );
+ CleanupStack::PopAndDestroy( con1 );
+
+ // DuplicateLC
+ con1 = CAccPolHdmiObjectCon::NewLC();
+ CreateHdmiObjectL( *con1, EAccPolHdmiAudioFormatObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiLatencyObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiSinkObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiSpeakerAllocationObject );
+ CreateHdmiObjectL( *con1, EAccPolHdmiVideoFormatObject );
+ con2 = static_cast<CAccPolHdmiObjectCon*>( con1->DuplicateLC() );
+ if( con1->Count() == con2->Count() )
+ {
+ TInt count = con1->Count();
+ CAccPolObjectBase* objBase1 = NULL;
+ CAccPolObjectBase* objBase2 = NULL;
+ for( TInt i = 0; i < count; i++ )
+ {
+ objBase1 = con1->AtL( i );
+ objBase2 = con2->AtL( i );
+ if( objBase1->ObjectType() != objBase2->ObjectType() )
+ {
+ err = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( con2 );
+ CleanupStack::PopAndDestroy( con1 );
+
+ // Rest of the API
+ con1 = CAccPolHdmiObjectCon::NewLC();
+ THdmiConObjectType objectType = EAccPolHdmiObjectCon;
+ TBool exit = EFalse;
+ TInt index = 0;
+ TInt count = 0;
+ do
+ {
+ index++;
+ err = KErrArgument;
+ objectType = ( THdmiConObjectType )( index );
+ CreateHdmiObjectL( *con1, objectType );
+ count = con1->Count();
+ CAccPolObjectBase* obj = NULL;
+ if( con1->Count() != index )
+ {
+ err = KErrArgument;
+ break;
+ }
+ for( TInt ii = 0; ii < count; ii++ )
+ {
+ obj = con1->AtL( ii );
+ if( obj->ObjectType() == objectType )
+ {
+ err = KErrNone;
+ break;
+ }
+ }
+ if( objectType == EAccPolHdmiVideoFormatObject )
+ {
+ // Last object
+ exit = ETrue;
+ }
+ }
+ while( !exit && ( err == KErrNone ) );
+ CleanupStack::PopAndDestroy( con1 );
+ CleanupStack::PopAndDestroy( buf );
+
+ return err;
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CheckHdmiSinkObjectL
+// ----------------------------------------------------------------------------------
+TInt CTFAccessoryTestControl::CheckHdmiSinkObjectL()
+ {
+ TInt err = KErrNone;
+ CAccPolHdmiSink* obj = NULL;
+ CAccPolHdmiSink* objDuplicate = NULL;
+ TUint8 objectType = 0;
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ // NewL
+ obj = CAccPolHdmiSink::NewL();
+ CleanupStack::PushL( obj );
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewL - with params
+ obj = CAccPolHdmiSink::NewL( ETrue, ETrue );
+ CleanupStack::PushL( obj );
+ if( !obj->BasicAudioSupport() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->HdcpSupport() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC
+ obj = CAccPolHdmiSink::NewLC();
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC - with params
+ obj = CAccPolHdmiSink::NewLC( ETrue, ETrue );
+ if( !obj->BasicAudioSupport() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->HdcpSupport() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // Internalize & Externalize
+ obj = CAccPolHdmiSink::NewLC( ETrue, ETrue );
+
+ RBufWriteStream writeStream;
+ writeStream.Open( *buf );
+ writeStream.PushL();
+ obj->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiSink::NewLC();
+ RBufReadStream readStream;
+ readStream.Open( *buf );
+ readStream.PushL();
+ objectType = readStream.ReadUint8L();
+ obj->InternalizeL( readStream );
+ if( objectType != EAccPolHdmiSinkObject )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->BasicAudioSupport() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->HdcpSupport() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ // DuplicateLC - mem compare can be used since the object does not contain
+ // any ponters as memebers
+ obj = CAccPolHdmiSink::NewLC( ETrue, ETrue );
+ objDuplicate = static_cast<CAccPolHdmiSink*>( obj->DuplicateLC() );
+ TUint8* left = reinterpret_cast<TUint8*>( obj );
+ TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
+ TInt size = sizeof( CAccPolHdmiSink );
+ if( Mem::Compare( left, size, right, size ) != KErrNone )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( objDuplicate );
+ CleanupStack::PopAndDestroy( obj );
+
+ // Rest of the API
+ obj = CAccPolHdmiSink::NewLC();
+ obj->SetBasicAudioSupport( ETrue );
+ if( !obj->BasicAudioSupport() )
+ {
+ err = KErrArgument;
+ }
+ obj->SetHdcpSupport( ETrue );
+ if( !obj->HdcpSupport() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+ CleanupStack::PopAndDestroy( buf );
+ return err;
+ }
+
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CheckHdmiAudioFormatObjectL
+// ----------------------------------------------------------------------------------
+TInt CTFAccessoryTestControl::CheckHdmiAudioFormatObjectL()
+ {
+ TInt err = KErrNone;
+ CAccPolHdmiAudioFormat* obj = NULL;
+ CAccPolHdmiAudioFormat* objDuplicate = NULL;
+ TUint8 objectType = 0;
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ // NewL
+ obj = CAccPolHdmiAudioFormat::NewL();
+ CleanupStack::PushL( obj );
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewL - with params
+ obj = CAccPolHdmiAudioFormat::NewL( HdmiAudioFormat::KUidFormatPCM16,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1 );
+ if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatPCM16 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->ChannelCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->BitResolution() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->MaxBitResolution() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->SamFreq() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->FormatDependentValue() != 1 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PushL( obj );
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC
+ obj = CAccPolHdmiAudioFormat::NewLC();
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC - with params
+ obj = CAccPolHdmiAudioFormat::NewLC( HdmiAudioFormat::KUidFormatPCM16,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1 );
+ if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatPCM16 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->ChannelCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->BitResolution() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->MaxBitResolution() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->SamFreq() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->FormatDependentValue() != 1 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // Internalize & Externalize
+ obj = CAccPolHdmiAudioFormat::NewLC( HdmiAudioFormat::KUidFormatPCM16,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1 );
+ RBufWriteStream writeStream;
+ writeStream.Open( *buf );
+ writeStream.PushL();
+ obj->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiAudioFormat::NewLC();
+ RBufReadStream readStream;
+ readStream.Open( *buf );
+ readStream.PushL();
+ objectType = readStream.ReadUint8L();
+ obj->InternalizeL( readStream );
+ if( objectType != EAccPolHdmiAudioFormatObject )
+ {
+ err = KErrArgument;
+ }
+ if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatPCM16 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->ChannelCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->BitResolution() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->MaxBitResolution() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->SamFreq() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->FormatDependentValue() != 1 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ // DuplicateLC - mem compare can be used since the object does not contain
+ // any ponters as memebers
+ obj = CAccPolHdmiAudioFormat::NewLC( HdmiAudioFormat::KUidFormatPCM16,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1 );
+ objDuplicate = static_cast<CAccPolHdmiAudioFormat*>( obj->DuplicateLC() );
+ TUint8* left = reinterpret_cast<TUint8*>( obj );
+ TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
+ TInt size = sizeof( CAccPolHdmiSink );
+ if( Mem::Compare( left, size, right, size ) != KErrNone )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( objDuplicate );
+ CleanupStack::PopAndDestroy( obj );
+
+ // Rest of the API
+ obj = CAccPolHdmiAudioFormat::NewLC();
+ obj->SetAudioFormat( HdmiAudioFormat::KUidFormatEAC3 );
+ if( obj->AudioFormat() != HdmiAudioFormat::KUidFormatEAC3 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetChannelCount( 2 );
+ if( obj->ChannelCount() != 2 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample20 );
+ if( !( obj->BitResolution() & CAccPolHdmiAudioFormat::EBitsPerSample20 ) )
+ {
+ err = KErrArgument;
+ }
+ obj->SetMaxBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample24 );
+ if( obj->MaxBitResolution() != CAccPolHdmiAudioFormat::EBitsPerSample24 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetSamFreq( CAccPolHdmiAudioFormat::ESamplingFreq192KHz );
+ if( !( obj->SamFreq() & CAccPolHdmiAudioFormat::ESamplingFreq192KHz ) )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFormatDependentValue( CAccPolHdmiAudioFormat::EBitsPerSample16 );
+ if( !( obj->FormatDependentValue() & CAccPolHdmiAudioFormat::EBitsPerSample16 ) )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+ CleanupStack::PopAndDestroy( buf );
+
+ return err;
+ }
+
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CheckHdmiLatencyObjectL
+// ----------------------------------------------------------------------------------
+TInt CTFAccessoryTestControl::CheckHdmiLatencyObjectL()
+ {
+ TInt err = KErrNone;
+ CAccPolHdmiLatency* obj = NULL;
+ CAccPolHdmiLatency* objDuplicate = NULL;
+ TUint8 objectType = 0;
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ // NewL
+ obj = CAccPolHdmiLatency::NewL();
+ CleanupStack::PushL( obj );
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewL - with params
+ obj = CAccPolHdmiLatency::NewL( HdmiLatency::KUidLatency, 100, 200 );
+ CleanupStack::PushL( obj );
+ if( obj->LatencyType() != HdmiLatency::KUidLatency )
+ {
+ err = KErrArgument;
+ }
+ if( obj->AudioLatency() != 100 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->VideoLatency() != 200 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC
+ obj = CAccPolHdmiLatency::NewLC();
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC - with params
+ obj = CAccPolHdmiLatency::NewLC( HdmiLatency::KUidLatency, 100, 200 );
+ if( obj->LatencyType() != HdmiLatency::KUidLatency )
+ {
+ err = KErrArgument;
+ }
+ if( obj->AudioLatency() != 100 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->VideoLatency() != 200 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // Internalize & Externalize
+ obj = CAccPolHdmiLatency::NewLC( HdmiLatency::KUidLatency, 100, 200 );
+ RBufWriteStream writeStream;
+ writeStream.Open( *buf );
+ writeStream.PushL();
+ obj->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiLatency::NewLC();
+ RBufReadStream readStream;
+ readStream.Open( *buf );
+ readStream.PushL();
+ objectType = readStream.ReadUint8L();
+ obj->InternalizeL( readStream );
+ if( objectType != EAccPolHdmiLatencyObject )
+ {
+ err = KErrArgument;
+ }
+ if( obj->LatencyType() != HdmiLatency::KUidLatency )
+ {
+ err = KErrArgument;
+ }
+ if( obj->AudioLatency() != 100 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->VideoLatency() != 200 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ // DuplicateLC - mem compare can be used since the object does not contain
+ // any ponters as memebers
+ obj = CAccPolHdmiLatency::NewLC( HdmiLatency::KUidLatency, 100, 200 );
+ objDuplicate = static_cast<CAccPolHdmiLatency*>( obj->DuplicateLC() );
+ TUint8* left = reinterpret_cast<TUint8*>( obj );
+ TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
+ TInt size = sizeof( CAccPolHdmiLatency );
+ if( Mem::Compare( left, size, right, size ) != KErrNone )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( objDuplicate );
+ CleanupStack::PopAndDestroy( obj );
+
+ // Rest of the API
+ obj = CAccPolHdmiLatency::NewLC();
+ obj->SetLatencyType( HdmiLatency::KUidLatency );
+ if( obj->LatencyType() != HdmiLatency::KUidLatency )
+ {
+ err = KErrArgument;
+ }
+ obj->SetAudioLatency( 100 );
+ if( obj->AudioLatency() != 100 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetVideoLatency( 200 );
+ if( obj->VideoLatency() != 200 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+ CleanupStack::PopAndDestroy( buf );
+
+ return err;
+ }
+
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CheckHdmiSpeakerAllocationObjectL
+// ----------------------------------------------------------------------------------
+TInt CTFAccessoryTestControl::CheckHdmiSpeakerAllocationObjectL()
+ {
+ TInt err = KErrNone;
+ CAccPolHdmiSpeakerAllocation* obj = NULL;
+ CAccPolHdmiSpeakerAllocation* objDuplicate = NULL;
+ TUint8 objectType = 0;
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+ TUint32 bits = 0x0;
+
+ // NewL
+ obj = CAccPolHdmiSpeakerAllocation::NewL();
+ CleanupStack::PushL( obj );
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC
+ obj = CAccPolHdmiSpeakerAllocation::NewLC();
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewL - with params
+ bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
+ CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
+ obj = CAccPolHdmiSpeakerAllocation::NewL( bits );
+ CleanupStack::PushL( obj );
+ if( !obj->FrontCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->RearCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiSpeakerAllocation::NewL( EFalse,
+ EFalse,
+ EFalse,
+ ETrue,
+ EFalse,
+ EFalse,
+ ETrue,
+ EFalse,
+ EFalse,
+ EFalse,
+ EFalse );
+ CleanupStack::PushL( obj );
+ if( !obj->FrontCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->RearCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC - with params
+ bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
+ CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
+ obj = CAccPolHdmiSpeakerAllocation::NewLC( bits );
+ if( !obj->FrontCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->RearCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiSpeakerAllocation::NewLC( EFalse,
+ EFalse,
+ EFalse,
+ ETrue,
+ EFalse,
+ EFalse,
+ ETrue,
+ EFalse,
+ EFalse,
+ EFalse,
+ EFalse );
+ if( !obj->FrontCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->RearCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // Internalize & Externalize
+ bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
+ CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
+ obj = CAccPolHdmiSpeakerAllocation::NewLC( bits );
+ RBufWriteStream writeStream;
+ writeStream.Open( *buf );
+ writeStream.PushL();
+ obj->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiSpeakerAllocation::NewLC();
+ RBufReadStream readStream;
+ readStream.Open( *buf );
+ readStream.PushL();
+ objectType = readStream.ReadUint8L();
+ obj->InternalizeL( readStream );
+ if( objectType != EAccPolHdmiSpeakerAllocationObject )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->FrontCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->RearCenter() )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ // DuplicateLC - mem compare can be used since the object does not contain
+ // any ponters as memebers
+ bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
+ CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter;
+ obj = CAccPolHdmiSpeakerAllocation::NewLC( bits );
+ objDuplicate = static_cast<CAccPolHdmiSpeakerAllocation*>( obj->DuplicateLC() );
+ TUint8* left = reinterpret_cast<TUint8*>( obj );
+ TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
+ TInt size = sizeof( CAccPolHdmiSpeakerAllocation );
+ if( Mem::Compare( left, size, right, size ) != KErrNone )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( objDuplicate );
+ CleanupStack::PopAndDestroy( obj );
+
+ // Rest of the API
+ bits = CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter |
+ CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter |
+ CAccPolHdmiSpeakerAllocation::EHdmiSpeakerTopCenter;
+ obj = CAccPolHdmiSpeakerAllocation::NewLC();
+ obj->SetSpeakerAllocation( bits );
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerFrontCenter ) )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerRearCenter ) )
+ {
+ err = KErrArgument;
+ }
+ if( !( obj->SpeakerAllocation() & CAccPolHdmiSpeakerAllocation::EHdmiSpeakerTopCenter ) )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiSpeakerAllocation::NewLC();
+ obj->SetFrontSpeakers( ETrue );
+ if( !obj->FrontSpeakers() || obj->SpeakerCount() != 2 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontSpeakers( EFalse );
+ if( obj->FrontSpeakers() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetRearSpeakers( ETrue );
+ if( !obj->RearSpeakers() || obj->SpeakerCount() != 2 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetRearSpeakers( EFalse );
+ if( obj->RearSpeakers() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetLowFrequencyEffect( ETrue );
+ if( !obj->LowFrequencyEffect() || obj->SpeakerCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetLowFrequencyEffect( EFalse );
+ if( obj->LowFrequencyEffect() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontCenter( ETrue );
+ if( !obj->FrontCenter() || obj->SpeakerCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontCenter( EFalse );
+ if( obj->FrontCenter() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontCenterHigh( ETrue );
+ if( !obj->FrontCenterHigh() || obj->SpeakerCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontCenterHigh( EFalse );
+ if( obj->FrontCenterHigh() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetTopCenter( ETrue );
+ if( !obj->TopCenter() || obj->SpeakerCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetTopCenter( EFalse );
+ if( obj->TopCenter() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetRearCenter( ETrue );
+ if( !obj->RearCenter() || obj->SpeakerCount() != 1 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetRearCenter( EFalse );
+ if( obj->RearCenter() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontLeftRightCenter( ETrue );
+ if( !obj->FrontLeftRightCenter() || obj->SpeakerCount() != 2 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontLeftRightCenter( EFalse );
+ if( obj->FrontLeftRightCenter() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetRearLeftRightCenter( ETrue );
+ if( !obj->RearLeftRightCenter() || obj->SpeakerCount() != 2 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetRearLeftRightCenter( EFalse );
+ if( obj->RearLeftRightCenter() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontWideSpeakers( ETrue );
+ if( !obj->FrontWideSpeakers() || obj->SpeakerCount() != 2 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontWideSpeakers( EFalse );
+ if( obj->FrontWideSpeakers() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontHighSpeakers( ETrue );
+ if( !obj->FrontHighSpeakers() || obj->SpeakerCount() != 2 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetFrontHighSpeakers( EFalse );
+ if( obj->FrontHighSpeakers() || obj->SpeakerCount() != 0 )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+ CleanupStack::PopAndDestroy( buf );
+
+ return err;
+ }
+
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CheckHdmiVideoFormatObjectL
+// ----------------------------------------------------------------------------------
+TInt CTFAccessoryTestControl::CheckHdmiVideoFormatObjectL()
+ {
+ TInt err = KErrNone;
+ CAccPolHdmiVideoFormat* obj = NULL;
+ CAccPolHdmiVideoFormat* objDuplicate = NULL;
+ TUint8 objectType = 0;
+ CBufFlat* buf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );
+ CleanupStack::PushL( buf );
+ buf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+
+ // NewL
+ obj = CAccPolHdmiVideoFormat::NewL();
+ CleanupStack::PushL( obj );
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC
+ obj = CAccPolHdmiVideoFormat::NewLC();
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewL - with params
+ obj = CAccPolHdmiVideoFormat::NewL( E640x480p59_94d60Hz4d3,
+ E640x350p85HzRB,
+ 1,
+ ETrue );
+ CleanupStack::PushL( obj );
+ if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->DmtFixedMode() != E640x350p85HzRB )
+ {
+ err = KErrArgument;
+ }
+ if( obj->PixelRepeat() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->Interlaced() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // NewLC - with params
+ obj = CAccPolHdmiVideoFormat::NewLC( E640x480p59_94d60Hz4d3,
+ E640x350p85HzRB,
+ 1,
+ ETrue );
+ if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->DmtFixedMode() != E640x350p85HzRB )
+ {
+ err = KErrArgument;
+ }
+ if( obj->PixelRepeat() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->Interlaced() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+
+ // Internalize & Externalize
+ obj = CAccPolHdmiVideoFormat::NewLC( E640x480p59_94d60Hz4d3,
+ E640x350p85HzRB,
+ 1,
+ ETrue );
+ RBufWriteStream writeStream;
+ writeStream.Open( *buf );
+ writeStream.PushL();
+ obj->ExternalizeL( writeStream );
+ writeStream.CommitL();
+ CleanupStack::PopAndDestroy( &writeStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ obj = CAccPolHdmiVideoFormat::NewLC();
+ RBufReadStream readStream;
+ readStream.Open( *buf );
+ readStream.PushL();
+ objectType = readStream.ReadUint8L();
+ obj->InternalizeL( readStream );
+ if( objectType != EAccPolHdmiVideoFormatObject )
+ {
+ err = KErrArgument;
+ }
+ if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
+ {
+ err = KErrArgument;
+ }
+ if( obj->DmtFixedMode() != E640x350p85HzRB )
+ {
+ err = KErrArgument;
+ }
+ if( obj->PixelRepeat() != 1 )
+ {
+ err = KErrArgument;
+ }
+ if( !obj->Interlaced() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy( obj );
+
+ // DuplicateLC - mem compare can be used since the object does not contain
+ // any ponters as memebers
+ obj = CAccPolHdmiVideoFormat::NewLC( E640x480p59_94d60Hz4d3,
+ E640x350p85HzRB,
+ 1,
+ ETrue );
+ objDuplicate = static_cast<CAccPolHdmiVideoFormat*>( obj->DuplicateLC() );
+ TUint8* left = reinterpret_cast<TUint8*>( obj );
+ TUint8* right = reinterpret_cast<TUint8*>( objDuplicate );
+ TInt size = sizeof( CAccPolHdmiVideoFormat );
+ if( Mem::Compare( left, size, right, size ) != KErrNone )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( objDuplicate );
+ CleanupStack::PopAndDestroy( obj );
+
+ // Rest of the API
+ obj = CAccPolHdmiVideoFormat::NewLC();
+ obj->SetCeaFixedMode( E640x480p59_94d60Hz4d3 );
+ if( obj->CeaFixedMode() != E640x480p59_94d60Hz4d3 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetDmtFixedMode( E640x350p85HzRB );
+ if( obj->DmtFixedMode() != E640x350p85HzRB )
+ {
+ err = KErrArgument;
+ }
+ obj->SetPixelRepeat( 4 );
+ if( obj->PixelRepeat() != 4 )
+ {
+ err = KErrArgument;
+ }
+ obj->SetInterlaced( ETrue );
+ if( !obj->Interlaced() )
+ {
+ err = KErrArgument;
+ }
+ CleanupStack::PopAndDestroy( obj );
+ CleanupStack::PopAndDestroy( buf );
+
+ return err;
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver* CTFAccessoryTestControl::CreateObserver()
+// ----------------------------------------------------------------------------------
+CTFTestControlObserver* CTFAccessoryTestControl::CreateObserver()
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CreateObserver()" ) ) );
+ iStack.AddFirst/*AddLast*/( *CTFTestControlObserver::NewL( *this ) );
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::CreateObserver() return" ) ) );
+ return iStack.First/*Last*/();
+ }
+
+// Not used at this point.
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::ProcessMessageAndCompleteL
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::ProcessMessageAndCompleteL( const RMessage2& aMessage )
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ProcessMessageAndCompleteL enter" ) ) );
+ aMessage.Complete( KErrNone );
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFAccessoryTestControl::ProcessMessageAndCompleteL return" ) ) );
+ }
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::MessageCompleteL
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::MessageCompleteL( TInt /*aResult*/)
+ {
+
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFAccessoryTestControl::CreateHdmiObjectL
+// ----------------------------------------------------------------------------------
+void CTFAccessoryTestControl::CreateHdmiObjectL( CAccPolObjectCon& aCon,
+ THdmiConObjectType aType )
+ {
+ switch( aType )
+ {
+ case EAccPolHdmiSinkObject:
+ {
+ CAccPolHdmiSink* sink = CAccPolHdmiSink::NewLC();
+ sink->SetBasicAudioSupport( ETrue );
+ sink->SetHdcpSupport( ETrue );
+ aCon.AddL( *sink );
+ CleanupStack::PopAndDestroy( sink );
+ break;
+ }
+ case EAccPolHdmiAudioFormatObject:
+ {
+ CAccPolHdmiAudioFormat* audioFormat = CAccPolHdmiAudioFormat::NewLC();
+ audioFormat->SetAudioFormat( HdmiAudioFormat::KUidFormatPCM16 );
+ audioFormat->SetChannelCount( 2 );
+ audioFormat->SetBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample16 );
+ audioFormat->SetMaxBitResolution( CAccPolHdmiAudioFormat::EBitsPerSample16 );
+ audioFormat->SetFormatDependentValue( CAccPolHdmiAudioFormat::EBitsPerSample16 );
+ audioFormat->SamFreq( CAccPolHdmiAudioFormat::ESamplingFreq32KHz );
+ aCon.AddL( *audioFormat );
+ CleanupStack::PopAndDestroy( audioFormat );
+ break;
+ }
+ case EAccPolHdmiLatencyObject:
+ {
+ CAccPolHdmiLatency* latency = CAccPolHdmiLatency::NewLC();
+ latency->SetLatencyType( HdmiLatency::KUidLatency );
+ latency->SetAudioLatency( 100 );
+ latency->SetVideoLatency( 200 );
+ aCon.AddL( *latency );
+ CleanupStack::PopAndDestroy( latency );
+ break;
+ }
+ case EAccPolHdmiSpeakerAllocationObject:
+ {
+ CAccPolHdmiSpeakerAllocation* speakerAllocation =
+ CAccPolHdmiSpeakerAllocation::NewLC();
+ speakerAllocation->SetFrontSpeakers( ETrue );
+ speakerAllocation->SetRearSpeakers( ETrue );
+ speakerAllocation->SetLowFrequencyEffect( ETrue );
+ speakerAllocation->SetFrontCenter( ETrue );
+ speakerAllocation->SetFrontCenterHigh( ETrue );
+ speakerAllocation->SetTopCenter( ETrue );
+ speakerAllocation->SetRearCenter( ETrue );
+ speakerAllocation->SetFrontLeftRightCenter( ETrue );
+ speakerAllocation->SetRearLeftRightCenter( ETrue );
+ speakerAllocation->SetFrontWideSpeakers( ETrue );
+ speakerAllocation->SetFrontHighSpeakers( ETrue );
+ aCon.AddL( *speakerAllocation );
+ CleanupStack::PopAndDestroy( speakerAllocation );
+ break;
+ }
+ case EAccPolHdmiVideoFormatObject:
+ {
+ CAccPolHdmiVideoFormat* videoFormat = CAccPolHdmiVideoFormat::NewLC();
+ videoFormat->SetCeaFixedMode( E640x480p59_94d60Hz4d3 );
+ videoFormat->SetDmtFixedMode( E640x480p85HzRB );
+ videoFormat->SetInterlaced( EFalse );
+ aCon.AddL( *videoFormat );
+ CleanupStack::PopAndDestroy( videoFormat );
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+
+void CTFAccessoryTestControl::AccessoryConnectionOpenClose(TTFAccessoryFunction aCase, TInt* aRetval)
+ {
+ switch(aCase)
+ {
+ case ETFAccessoryConnection_Open:
+ {
+ if ( iAccessoryConnection == NULL )
+ {
+ iAccessoryConnection = new ( ELeave ) RAccessoryConnection;
+ *aRetval = iAccessoryConnection->CreateSubSession( iAccessoryServer );
+ COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL(TTFAccessoryTestCaseStateControl& aParameter) - ETFAccessoryConnection_Open - Sub session created - (%d)" ), *aRetval ) );
+ }
+ else
+ {
+ *aRetval = KErrNone;
+ COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL(TTFAccessoryTestCaseStateControl& aParameter) - ETFAccessoryConnection_Open - Sub session not created - (%d)" ), *aRetval ) );
+ }
+ }
+ break;
+
+ case ETFAccessoryConnection_Close:
+ {
+ TRACE_ASSERT( iAccessoryConnection != NULL );
+
+ if ( iAccessoryConnection != NULL )
+ {
+ iAccessoryConnection->CloseSubSession();
+ delete iAccessoryConnection;
+ iAccessoryConnection = NULL;
+ COMPONENT_TRACE( ( _L( "CTFAccessoryTestControl::CallAccessoryFunctionL(TTFAccessoryTestCaseStateControl& aParameter) - ETFAccessoryConnection_Close - Sub session closed" ) ) );
+ }
+ *aRetval = KErrNone;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ }
+
+void CTFAccessoryTestControl::FindAndCheckRequestL( TInt* aRetval, TTFAccessoryTestCaseStateControl& aParameter )
+ {
+ CTFAccessoryTestCaseControl* testCase = STATIC_CAST( CTFAccessoryTestCaseControl*, CurrentTestCase());
+ TInt errVal = 0;
+
+ TRACE_ASSERT( testCase != NULL );
+ if ( testCase != NULL )
+ {
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::FindAndCheckRequest() - inside if ( testCase != NULL )" ) ) );
+ if(!iStack.IsEmpty())
+ {
+ iStackIter.SetToFirst();
+
+ while ( ( iObserverItem = iStackIter++ ) != NULL )
+ {
+ if(iObserverItem->FindRequest(aParameter.iRequestType))
+ {
+ testCase->CheckRequest( iObserverItem->iStatus,
+ iObserverItem->iValue,
+ iObserverItem->iCapabilityName,
+ &errVal );
+
+ if(errVal == KTFDontDeleteObserver)
+ {
+ aParameter.iArg1 = KTFDontDeleteObserver;
+ }
+
+
+ if ( !iStack.IsEmpty() ) // Check if observes are already deleted by CheckRequest()
+ {
+ if( KTFDontDeleteObserver != aParameter.iArg1 )
+ {
+ if (iObserverItem->iStatus == KRequestPending )
+ {
+ User::WaitForRequest(iObserverItem->iStatus);
+ }
+ iStack.Remove( *iObserverItem );
+ delete iObserverItem;
+ }
+ else
+ {
+ User::Leave( KTFDontDeleteObserver );
+ }
+ }
+ else
+ {
+ *aRetval = KErrGeneral;
+ }
+ }
+ }
+ }
+ else
+ {
+ *aRetval = KErrGeneral;
+ }
+ }
+
+ TEST_CASE_TRACE( ( _L( "CTFAccessoryTestControl::FindAndCheckRequest() returning and setting *aRetval = KErrNone )" ) ) );
+ *aRetval = KErrNone;
+ }
+
+
+void CTFAccessoryTestControl::AccessorySettingsOpenClose( TTFAccessoryFunction aCase, TInt* aRetval )
+ {
+ switch(aCase)
+ {
+ case ETFAccessorySettings_Open:
+ {
+ if ( iAccessorySettings == NULL )
+ {
+ iAccessorySettings = new ( ELeave ) RAccessorySettings;
+ *aRetval = iAccessorySettings->CreateSubSession( iAccessoryServer );
+ }
+ else
+ *aRetval = KErrNone;
+ }
+ break;
+
+ case ETFAccessorySettings_Close:
+ {
+ TRACE_ASSERT( iAccessorySettings != NULL );
+
+ if ( iAccessorySettings != NULL )
+ {
+ iAccessorySettings->CloseSubSession();
+ delete iAccessorySettings;
+ iAccessorySettings = NULL;
+ }
+ *aRetval = KErrNone;
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+void CTFAccessoryTestControl::SetSeveralAccessoryModeSetting( TInt* aRetval )
+ {
+ TAccModeSetting accModeSettingIn;
+ TAccMode tAccMode = EAccModeWirelessHeadset;
+ TBuf< KMaxAccModeSetting > aDesIn;
+ // Set
+ // setting 1
+ accModeSettingIn.SetId( 11 ); // unknown TInt
+ accModeSettingIn.SetTInt( 1 );
+ TAccModeSettingArray arrayIn;
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 2
+ accModeSettingIn.SetId( 12 ); // unknown Des
+ _LIT( KAccSetting2, "012345678901234567890" );
+ aDesIn.Copy( KAccSetting2 );
+ accModeSettingIn.SetTDes( aDesIn );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 3
+ accModeSettingIn.SetId( 13 ); // unknown TBool
+ accModeSettingIn.SetTBool( ETrue );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ *aRetval = iAccessorySettings->SetAccessoryModeSettingsL( tAccMode, arrayIn );
+ }
+
+void CTFAccessoryTestControl::GetSeveralAccessoryModeSetting( TInt* aRetval )
+ {
+ TAccModeSetting accModeSettingOut;
+ TAccMode tAccMode = EAccModeWirelessHeadset;
+ TBuf< KMaxAccModeSetting > aDesOut;
+ TAccModeSettingArray arrayOut;
+ TInt intOut( 0 );
+ // set input parameters for GetAccessoryModeSettings()
+ // setting 11
+ accModeSettingOut.SetId( 11 );
+ arrayOut.AddSetting( accModeSettingOut );
+
+ // setting 12
+ accModeSettingOut.SetId( 12 );
+ arrayOut.AddSetting( accModeSettingOut );
+
+ // setting 13
+ accModeSettingOut.SetId( 13 );
+ arrayOut.AddSetting( accModeSettingOut );
+
+ *aRetval = iAccessorySettings->GetAccessoryModeSettings( tAccMode, arrayOut );
+
+ // Check that got settings are right
+
+ TInt count = arrayOut.GetArraySize();
+ TInt foundCount(0);
+
+ for( TInt index = 0; index < count; index++ )
+ {
+ arrayOut.GetSetting( index, accModeSettingOut );
+
+ if( 11 == accModeSettingOut.Id() )
+ {
+
+ accModeSettingOut.GetTInt( intOut);
+
+ if( 1 == intOut )
+ {
+ foundCount++;
+ }
+ }
+
+
+ if( 12 == accModeSettingOut.Id() )
+ {
+ accModeSettingOut.GetTDes( aDesOut );
+
+ if( KErrNone == aDesOut.Compare( _L("012345678901234567890") ) )
+ {
+ foundCount++;
+ }
+
+ }
+
+ if( 13 == accModeSettingOut.Id() )
+ {
+
+ accModeSettingOut.GetTBool( intOut );
+
+ if( intOut )
+ {
+ foundCount++;
+ }
+ }
+ }
+
+ if(foundCount != 3)
+ {
+ *aRetval = KErrNotFound;
+ }
+
+ //
+ // Reset Settings
+ //
+ TAccModeSetting accModeSettingIn;
+ TBuf< KMaxAccModeSetting > aDesIn;
+ // Set
+ // setting 1
+ accModeSettingIn.SetId( 11 ); // unknown TInt
+ accModeSettingIn.SetTInt( 0 );
+ TAccModeSettingArray arrayIn;
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 2
+ accModeSettingIn.SetId( 12 ); // unknown Des
+ _LIT( KAccSetting2, "" );
+ aDesIn.Copy( KAccSetting2 );
+ accModeSettingIn.SetTDes( aDesIn );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ // setting 3
+ accModeSettingIn.SetId( 13 ); // unknown TBool
+ accModeSettingIn.SetTBool( EFalse );
+ arrayIn.AddSetting( accModeSettingIn );
+
+ iAccessorySettings->SetAccessoryModeSettingsL( tAccMode, arrayIn );
+
+ }
+
+void CTFAccessoryTestControl::SetIntValue( TTFAccessoryTestCaseStateControl& aParameter, TInt *aRetval )
+ {
+ switch( aParameter.iArg3 )
+ {
+ case KAccSetVolumeLevel:
+ {
+ //AccPolCommonNameValuePairs.h contains following example code
+ RAccessoryControl accessoryControl;
+ accessoryControl.CreateSubSession( iAccessoryServer );
+
+ CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL();
+ CleanupStack::PushL( nameArray );
+ accessoryControl.GetSubblockNameArrayL( iGenericId[aParameter.iGid], *nameArray );
+
+ TAccPolNameRecord nameRecord;
+ nameRecord.SetNameL( KAccSetVolumeLevel );
+ TAccValueTypeTInt value;
+
+ if( nameArray->HasName( KAccSetVolumeLevel ) )
+ {
+ accessoryControl.GetValueL( iGenericId[aParameter.iGid], nameRecord, value );
+ value.iValue = value.iValue | aParameter.iArg1;
+ accessoryControl.AccessoryValueChangedNotifyL( iGenericId[aParameter.iGid], nameRecord, value );
+ }
+
+ CleanupStack::PopAndDestroy( nameArray );
+ accessoryControl.CloseSubSession();
+ *aRetval = KErrNone;
+ }
+ break;
+
+ default:
+ {
+ TAccPolNameRecord aNameRecord;
+ aNameRecord.SetNameL( aParameter.iArg3 );
+ TAccValueTypeTInt aIntValue;
+ aIntValue.iValue = aParameter.iArg1;
+ *aRetval = iAccessoryControl->SetValueL( iGenericId[aParameter.iGid], aNameRecord, aIntValue );
+ }
+ break;
+ }
+
+ }
+
+void CTFAccessoryTestControl::SelectionDialog( TTFAccessoryFunction aCase, TInt* aRetval )
+ {
+ switch(aCase)
+ {
+ case ETFSelectionDialogText:
+ {
+ const TUid KAccFwUiDialogNotifierUid = { 0x10205062 };
+
+ RNotifier notifier;
+ notifier.Connect();
+
+ TInt selectionListBitmask = 255;
+ TInt reply = 0;
+
+ TPckg<TInt> replyPck( reply);
+ TPckg<TUint32> selectionBitmaskPackage( selectionListBitmask);
+
+ //activate active object
+ TRequestStatus status;
+ status = KRequestPending;
+
+ //open ui
+ notifier.StartNotifierAndGetResponse( status, KAccFwUiDialogNotifierUid, selectionBitmaskPackage, replyPck);
+
+ User::WaitForRequest( status);
+
+
+ notifier.Close();
+
+ *aRetval = KErrNone;
+ }
+
+ case ETFSelectionDialogCancel:
+ {
+ const TUid KAccFwUiDialogNotifierUid = { 0x10205062 };
+
+ RNotifier notifier;
+ notifier.Connect();
+
+ TInt selectionListBitmask = 7;
+ TInt reply = 0;
+
+ TPckg<TInt> replyPck( reply);
+ TPckg<TUint32> selectionBitmaskPackage( selectionListBitmask);
+
+ //activate active object
+ TRequestStatus status;
+
+ //open ui
+ notifier.StartNotifierAndGetResponse( status, KAccFwUiDialogNotifierUid, selectionBitmaskPackage, replyPck);
+ User::After( 2500000);
+ notifier.CancelNotifier( KAccFwUiDialogNotifierUid);
+
+ // Implementation of the dialog is changed. Request is completed every time
+ User::WaitForRequest( status );
+
+ notifier.Close();
+
+ *aRetval = KErrNone;
+ }
+
+ default:
+ break;
+
+ }
+
+ }
+
+void CTFAccessoryTestControl::CheckConnectedAccessory( TInt* aRetval )
+ {
+ *aRetval = KErrNone;
+
+ TAccPolGenericID genID; // TGeneric ID that should be connected
+ TAccPolGenericID genIDConnected; // TGeneric ID that is connected
+ TAccPolGIDHeader iGenericIDHeader; // Header of the GID that should be connected
+ TAccPolGIDHeader iGenericIDHeaderConnected; // Header of the connected GID
+ TAccPolGenericIDArray genericIdArray; // Array of connected generic ID's
+ CAccConGenericID* aGenericID = CAccConGenericID::NewL(); // This might be needed for capabilities
+
+ CleanupStack::PushL( aGenericID );
+ CAccPolSubblockNameArray* nameArrayConnected = CAccPolSubblockNameArray::NewL();
+
+ CleanupStack::PushL( nameArrayConnected );
+
+ TAccPolGenericID genericID = aGenericID->GenericID();
+
+ TBuf<KHWModelIDMaxLength> hwModelID(_L("headset"));
+ // Set GenericID header
+ iGenericIDHeader.iAccessoryDeviceType = KDTHeadset;
+ iGenericIDHeader.iPhysicalConnection = KPCWired;
+ iGenericIDHeader.iApplicationProtocol = 0x0;
+
+ iGenericIDHeader.iCapabilitiesSubblocks = KSBAudioSubblock;
+
+ iGenericIDHeader.iHWModelID = hwModelID;
+ iGenericIDHeader.iHWDeviceID = 0x0;
+ iGenericIDHeader.iDBID = 0x0;
+
+ RAccessoryConnection* accessoryConnection = new ( ELeave ) RAccessoryConnection();
+ CleanupStack::PushL( accessoryConnection );
+ accessoryConnection->CreateSubSession( iAccessoryServer );
+ accessoryConnection->GetAccessoryConnectionStatus( genericIdArray );
+ CleanupStack::PopAndDestroy( accessoryConnection );
+
+ genIDConnected = genericIdArray.GetGenericIDL( 0 );
+
+ RAccessorySingleConnection singleConnect;// = new ( ELeave ) RAccessoryConnectionBase();
+ singleConnect.CreateSubSession( iAccessoryServer );
+ singleConnect.GetSubblockNameArrayL( genIDConnected, *nameArrayConnected );
+
+ singleConnect.CloseSubSession();
+
+ iGenericIDHeaderConnected.iAccessoryDeviceType = genIDConnected.DeviceTypeCaps();
+ iGenericIDHeaderConnected.iPhysicalConnection = genIDConnected.PhysicalConnectionCaps();
+ iGenericIDHeaderConnected.iApplicationProtocol = genIDConnected.ApplicationProtocolCaps();
+ iGenericIDHeaderConnected.iCapabilitiesSubblocks = genIDConnected.SubblockCaps();
+ iGenericIDHeaderConnected.iHWModelID = genIDConnected.HWModelID();
+ iGenericIDHeaderConnected.iHWDeviceID = genIDConnected.HWDeviceID();
+ iGenericIDHeaderConnected.iDBID = 0x0;
+
+ //Check GenericID header
+ if( iGenericIDHeader.iAccessoryDeviceType != iGenericIDHeaderConnected.iAccessoryDeviceType )
+ {
+ *aRetval = EFalse;
+ }
+ if( iGenericIDHeader.iPhysicalConnection != iGenericIDHeaderConnected.iPhysicalConnection )
+ {
+ *aRetval = EFalse;
+ }
+ if( iGenericIDHeader.iApplicationProtocol != iGenericIDHeaderConnected.iApplicationProtocol )
+ {
+ *aRetval = EFalse;
+ }
+ if( iGenericIDHeader.iCapabilitiesSubblocks != iGenericIDHeaderConnected.iCapabilitiesSubblocks )
+ {
+ *aRetval = EFalse;
+ }
+ if( iGenericIDHeader.iHWModelID != iGenericIDHeaderConnected.iHWModelID )
+ {
+ *aRetval = EFalse;
+ }
+ if( iGenericIDHeader.iHWDeviceID != iGenericIDHeaderConnected.iHWDeviceID )
+ {
+ *aRetval = EFalse;
+ }
+ if( !( nameArrayConnected->HasName( KAccStereoAudio ) ) )
+ {
+ *aRetval = EFalse;
+ }
+
+ if( !( nameArrayConnected->HasName( KAccAudioOutConnector ) ) )
+ {
+ *aRetval = EFalse;
+ }
+
+ if( !( nameArrayConnected->HasName( KAccAudioOutputType ) ) )
+ {
+ *aRetval = EFalse;
+ }
+ //CleanupStack::PopAndDestroy( nameValueArray );
+ CleanupStack::PopAndDestroy( nameArrayConnected );
+ CleanupStack::PopAndDestroy( aGenericID );
+
+ }
+
+
+void CTFAccessoryTestControl::CallTClassMethods( TInt* aRetval )
+ {
+ // Settings();
+ Policy();
+ *aRetval = KErrNone;
+ }
+
+void CTFAccessoryTestControl::Settings()
+ {
+ TAccModeSettingArray array;
+ array.Reset();
+ TInt ret = array.GetMaxArraySize();
+ TAccModeSetting setting;
+ TUint32 settingId( 1 );
+ setting.SetId( settingId );
+ array.AddSetting( setting );
+ TAccModeSetting setting2;
+ ret = array.GetSetting( 0, setting2 );
+ ret = array.GetArraySize();
+ }
+
+void CTFAccessoryTestControl::Policy()
+ {
+ TInt valueInt( 1 );
+ TUint32 valueUInt( 1 );
+ TDesC8 des( _L8( "timo" ) );
+ //TDes8 valueDesc = des;
+ TAccPolNameRecord nameRecord;
+ TAccPolValueRecord valRec( des, EAPVPolicy );
+ TAccPolNameValueRecord nameValRec;
+ TAccPolNameValueRecord nameValRec1( nameRecord, valRec );
+ TAccPolNameValueRecord nameValRec2( valueUInt, valueInt, EAPVInt, EAPVPolicy );
+ TAccPolNameValueRecord nameValRec3( valueUInt, des, EAPVPolicy );
+ TAccPolNameValueRecord nameValRec4( valueUInt );
+ //TDesC8 valueToGet;
+ valRec.GetValueL( des );
+ valRec.SetValue( des );
+ //valRec.SetValue( valueToGet );
+ TAccPolValueRecord valRec1( valueInt, EAPVInt, EAPVPolicy );
+ valRec1.SetValue( valueInt );
+ valRec1.SetLocation( EAPVPolicy );
+ valRec1.SetL( valueInt, EAPVInt, EAPVPolicy );
+ }
+
+void CTFAccessoryTestControl::GetBoolAccessoryModeSetting( TTFAccessoryTestCaseStateControl& aParameter, TInt* aRetval )
+ {
+ TBool aSettingsValueBool;
+
+ TAccMode aAccMode = (TAccMode)aParameter.iArg1;
+ TAccModeSetting aSetting;
+ aSetting.SetId(aParameter.iArg2);
+
+ *aRetval = iAccessorySettings->GetAccessoryModeSetting(aAccMode, aSetting);
+
+ if( aSetting.Type() == EAccModeSettingBool)
+ {
+ *aRetval = aSetting.GetTBool(aSettingsValueBool);
+
+ if(*aRetval != KErrNotFound)
+ {
+ if(aSettingsValueBool == (TBool)aParameter.iArg4)
+ {
+ *aRetval = KErrNone;
+ }
+ else
+ {
+ *aRetval = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ *aRetval = KErrNotFound;
+ }
+ }
+
+void CTFAccessoryTestControl::GetIntAccessoryModeSetting( TTFAccessoryTestCaseStateControl& aParameter, TInt* aRetval )
+ {
+ TInt aSettingsValueInt;
+
+ TAccMode aAccMode = (TAccMode)aParameter.iArg1;
+ TAccModeSetting aSetting;
+ aSetting.SetId(aParameter.iArg2);
+
+ *aRetval = iAccessorySettings->GetAccessoryModeSetting(aAccMode, aSetting);
+
+ if(aSetting.Type() == EAccModeSettingInt)
+ {
+ *aRetval = aSetting.GetTInt(aSettingsValueInt);
+
+ if(*aRetval != KErrNotFound)
+ {
+ if( aSettingsValueInt == aParameter.iArg4 )
+ {
+ *aRetval = KErrNone;
+ }
+ else
+ {
+ *aRetval = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ *aRetval = KErrNotFound;
+ }
+ }
+
+void CTFAccessoryTestControl::GetDesAccessoryModeSetting( TTFAccessoryTestCaseStateControl& aParameter, TInt* aRetval )
+ {
+ TBuf<KMaxAccModeSetting> aSettingsValueDes;
+
+ TAccMode aAccMode = (TAccMode)aParameter.iArg1;
+ TAccModeSetting aSetting;
+ aSetting.SetId( aParameter.iArg2 );
+
+ *aRetval = iAccessorySettings->GetAccessoryModeSetting( aAccMode, aSetting );
+
+ if( aSetting.Type() == EAccModeSettingDes )
+ {
+ *aRetval = aSetting.GetTDes( aSettingsValueDes );
+
+ if(*aRetval != KErrNotFound)
+ {
+ TBuf<KMaxAccModeSetting> buffer;
+ buffer.Num( aParameter.iArg3 );
+ if( KErrNone == aSettingsValueDes.Compare( buffer ) )
+ {
+ *aRetval = KErrNone;
+ }
+ else
+ {
+ *aRetval = KErrArgument;
+ }
+ }
+ }
+ else
+ {
+ *aRetval = KErrNotFound;
+ }
+ }
+
+// End of file
--- a/accessoryservices/accessoryserver/tsrc/public/basic/AccessoryTestControl/AccessoryTestControlPlugin/src/TfTestControlObserver.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/accessoryserver/tsrc/public/basic/AccessoryTestControl/AccessoryTestControlPlugin/src/TfTestControlObserver.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,753 +1,755 @@
-/*
- * Copyright (c) 2005 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:
- *
- */
-
-// INCLUDE FILES
-#include <tftypes.h>
-#include "siftrace.h"
-#include "CtfTestControlObserver.h"
-#include <AccPolGIDHeader.h>
-
-const TInt CTFTestControlObserver::iOffset = _FOFF(CTFTestControlObserver,iSlink);
-
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver* CTFTestControlObserver::NewL()
-// ----------------------------------------------------------------------------------
-CTFTestControlObserver* CTFTestControlObserver::NewL( CTFAccessoryTestControl& aTestControl )
- {
- CTFTestControlObserver* result =
- new ( ELeave ) CTFTestControlObserver( aTestControl );
- result->iObjectValueBuf = HBufC8::NewL( 256 );
- result->iObjectValue.iValue.Set( result->iObjectValueBuf->Des() );
- CleanupStack::PushL( result );
- CleanupStack::Pop();
- return result;
- }
-
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::CTFTestControlObserver()
-// ----------------------------------------------------------------------------------
-CTFTestControlObserver::CTFTestControlObserver( CTFAccessoryTestControl& aTestControl ) :
- CActive( CActive::EPriorityHigh ),
- iAccessoryTestControl( aTestControl ),
- iObjectValue( TPtr8( NULL, 0, 0 ) )
- {
-
- iRequestCompleted = ReqAccRequestNone;
- iCapabilityName = 0;
-
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::CTFTestControlObserver()" ) ) );
- CActiveScheduler::Add( this );
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::CTFTestControlObserver - return" ) ) );
- }
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::~CTFTestControlObserver()
-// ----------------------------------------------------------------------------------
-CTFTestControlObserver::~CTFTestControlObserver()
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::~CTFTestControlObserver - %d" ), iRequestType ) );
- delete iObjectValueBuf;
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::~CTFTestControlObserver - succesful" ) ) );
- }
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::RunL()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::RunL()
- {
-
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL - enter" ) ) );
-
- switch( iRequestType )
- {
-
- case ReqDisconnectBtAccessory:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqDisconnectBtAccessory" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqConnectBtAccessory:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqConnectBtAccessory" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqNotifyNewAccessoryConnected:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyNewAccessoryConnected" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqNotifyAccessoryDisconnected:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryDisconnected" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqNotifyAccessoryConnectionStatusChanged:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryConnectionStatusChanged" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqNotifyAccessoryModeChanged:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryModeChanged" ) ) );
- iRequestCompleted = iRequestType;
- iValue = iAccMode.iAccessoryMode;
- }
- break;
-
- case ReqGetAccessoryMode:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqGetAccessoryMode" ) ) );
- iRequestCompleted = iRequestType;
- iValue = iAccMode.iAccessoryMode;
- }
- break;
-
- case ReqNotifyAccessoryAudioLinkOpened:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqConnectBtAccessory" ) ) );
- iRequestCompleted = iRequestType;
- iValue = iAudioType;
- }
- break;
-
- case ReqAccessoryAudioLinkOpen:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqConnectBtAccessory" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqNotifyBluetoothAudioLinkOpenReq:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyBluetoothAudioLinkOpenReq" ) ) );
- iRequestCompleted = iRequestType;
- iValue = iAudioType;
- }
- break;
-
- case ReqNotifyAccessoryAudioLinkClosed:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryAudioLinkClosed" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqAccessoryAudioLinkClose:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqAccessoryAudioLinkClose" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqNotifyBluetoothAudioLinkCloseReq:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyBluetoothAudioLinkCloseReq" ) ) );
- iRequestCompleted = iRequestType;
- iValue = iAudioType;
- }
- break;
-
- case ReqNotifyIntegerAccessoryValueChanged:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyIntegerAccessoryValueChanged" ) ) );
- iCapabilityName = 0;
- iRequestCompleted = iRequestType;
- iValue = iIntegerValue.iValue;
- }
- break;
-
- case ReqNotifyBooleanAccessoryValueChanged:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyBooleanAccessoryValueChanged" ) ) );
- iCapabilityName = 0;
- iRequestCompleted = iRequestType;
- iValue = ( TInt )iBooleanValue.iValue;
- }
- break;
-
- case ReqNotifyObjectAccessoryValueChanged:
- {
- iCapabilityName = 0;
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqAccessoryConnection:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqAccessoryConnection" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqAccessoryDisconnection:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqAccessoryDisconnection" ) ) );
- iRequestCompleted = iRequestType;
- }
- break;
-
- case ReqGetAccessoryConnectionStatus:
- {
- COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqGetAccessoryConnectionStatus" ) ) );
- iRequestCompleted = iRequestType;
- iValue = iAccessoryTestControl.iGenericIdArray.Count();
- }
- break;
-
- default:
- TRACE_ASSERT_ALWAYS;
- break;
- }
-
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL - return" ) ) );
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::RunError()
-// ----------------------------------------------------------------------------------
-TInt CTFTestControlObserver::RunError( TInt aError )
- {
- return aError;
- }
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::DoCancel()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::DoCancel()
- {
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DoCancel - enter" ) ) );
-
- switch( iRequestType )
- {
-
- case ReqDisconnectBtAccessory:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryBTControl->CancelDisconnectAccessory();
- }
- }
- break;
-
- case ReqConnectBtAccessory:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryBTControl->CancelConnectAccessory();
- }
- }
- break;
-
- case ReqNotifyNewAccessoryConnected:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessorySingleConnection->CancelNotifyNewAccessoryConnected();
- }
- }
- break;
-
- case ReqNotifyAccessoryDisconnected:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessorySingleConnection->CancelNotifyAccessoryDisconnected();
- }
- }
- break;
-
- case ReqNotifyAccessoryConnectionStatusChanged:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryConnection->CancelNotifyAccessoryConnectionStatusChanged();
- }
- }
- break;
-
- case ReqNotifyAccessoryModeChanged:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryMode->CancelNotifyAccessoryModeChanged();
- }
- }
- break;
-
- case ReqNotifyAccessoryAudioLinkOpened:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkOpened();
- }
- }
- break;
-
- case ReqAccessoryAudioLinkOpen:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryAudioControl->CancelAccessoryAudioLinkOpen();
- }
- }
- break;
-
- case ReqNotifyBluetoothAudioLinkOpenReq:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryBTControl->CancelNotifyBluetoothAudioLinkOpenReq();
- }
- }
- break;
-
- case ReqNotifyAccessoryAudioLinkClosed:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkClosed();
- }
- }
- break;
-
- case ReqAccessoryAudioLinkClose:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryAudioControl->CancelAccessoryAudioLinkClose();
- }
- }
- break;
-
- case ReqNotifyBluetoothAudioLinkCloseReq:
- {
- if( IsActive() )
- {
- iAccessoryTestControl.iAccessoryBTControl->CancelNotifyBluetoothAudioLinkCloseReq();
- }
- }
- break;
-
- case ReqGetAccessoryConnectionStatus:
- {
- //if(IsActive())
- //{
- //iAccessoryTestControl.iAccessoryConnection.CancelGetAccessoryConnectionStatus();
- // }
- }
- break;
-
- default:
- TRACE_ASSERT_ALWAYS;
- break;
- }
-
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DoCancel - Leave" ) ) );
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyNewAccessoryConnected
-// ----------------------------------------------------------------------------------
-
-void CTFTestControlObserver::NotifyNewAccessoryConnected( TAccPolGenericID& aGenericId )
- {
-
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyNewAccessoryConnected );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessorySingleConnection->NotifyNewAccessoryConnected( iStatus,
- aGenericId );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyNewAccessoryConnected outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyAccessoryDisconnected
-// ----------------------------------------------------------------------------------
-
-void CTFTestControlObserver::NotifyAccessoryDisconnected( TAccPolGenericID& aGenericId )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyAccessoryDisconnected );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryDisconnected( iStatus,
- aGenericId );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryDisconnected outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyAccessoryModeChanged
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyAccessoryModeChanged()
- {
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyAccessoryModeChanged );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryMode->NotifyAccessoryModeChanged( iStatus,
- iAccMode );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryModeChanged outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyAccessoryConnectionStatusChanged
-// ----------------------------------------------------------------------------------
-
-void CTFTestControlObserver::NotifyAccessoryConnectionStatusChanged( TAccPolGenericIDArray& aGenericIdArray )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyAccessoryConnectionStatusChanged );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryConnection->NotifyAccessoryConnectionStatusChanged( iStatus,
- aGenericIdArray );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryConnectionStatusChanged outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::AccessoryAudioLinkOpen()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::AccessoryAudioLinkOpen( TAccPolGenericID& aGenericId,
- TUint32 aAudioType )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqAccessoryAudioLinkOpen );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryAudioControl->AccessoryAudioLinkOpen( iStatus,
- aGenericId,
- ( TAccAudioType )aAudioType );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::AccessoryAudioLinkOpen outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyAccessoryAudioLinkOpened
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyAccessoryAudioLinkOpened( TAccPolGenericID& aGenericId )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyAccessoryAudioLinkOpened );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryAudioControl->NotifyAccessoryAudioLinkOpened( iStatus,
- aGenericId,
- iAudioType );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryAudioLinkOpened outstanding" ) ) );
- }
- }
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyAccessoryAudioLinkClosed
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyAccessoryAudioLinkClosed( TAccPolGenericID& aGenericId )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyAccessoryAudioLinkClosed );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryAudioControl->NotifyAccessoryAudioLinkClosed( iStatus,
- aGenericId,
- iAudioType );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryAudioLinkClosed outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::AccessoryAudioLinkClose
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::AccessoryAudioLinkClose( TAccPolGenericID& aGenericId,
- TUint32 aAudioType )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqAccessoryAudioLinkClose );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryAudioControl->AccessoryAudioLinkClose( iStatus,
- aGenericId,
- ( TAccAudioType )aAudioType );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::AccessoryAudioLinkClose outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyBluetoothAudioLinkOpenReq
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyBluetoothAudioLinkOpenReq()
- {
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyBluetoothAudioLinkOpenReq );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryBTControl->NotifyBluetoothAudioLinkOpenReq( iStatus,
- iBTaddr,
- iAudioType );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyBluetoothAudioLinkOpenReq outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyBluetoothAudioLinkCloseReq
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyBluetoothAudioLinkCloseReq()
- {
- if( !IsActive() )
- {
- SetRequestType( ReqNotifyBluetoothAudioLinkCloseReq );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryBTControl->NotifyBluetoothAudioLinkCloseReq( iStatus,
- iBTaddr,
- iAudioType );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyBluetoothAudioLinkCloseReq outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::ConnectBTAccessory()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::ConnectBTAccessory( TBTDevAddr& btaddr )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqConnectBtAccessory );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryBTControl->ConnectAccessory( iStatus,
- btaddr );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::ConnectBTAccessory outstanding" ) ) );
- }
-
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::DisconnectBTAccessory()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::DisconnectBTAccessory( TBTDevAddr& btaddr )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqDisconnectBtAccessory );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryBTControl->DisconnectAccessory( iStatus,
- btaddr );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DisconnectBTAccessory outstanding" ) ) );
- }
-
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyBooleanAccessoryValueChanged()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyBooleanAccessoryValueChanged( TAccPolGenericID& aGenericId,
- const TUint32& aName )
- {
- if( !IsActive() )
- {
- TAccPolNameRecord nameRecord;
- iCapabilityName = aName;
- nameRecord.SetNameL( aName );
- SetRequestType( ReqNotifyBooleanAccessoryValueChanged );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryValueChanged( iStatus,
- aGenericId,
- nameRecord,
- iBooleanValue );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyBooleanAccessoryValueChanged outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyIntegerAccessoryValueChanged()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyIntegerAccessoryValueChanged( TAccPolGenericID& aGenericId,
- const TUint32& aName )
- {
- if( !IsActive() )
- {
- TAccPolNameRecord nameRecord;
- iCapabilityName = aName;
- nameRecord.SetNameL( aName );
- SetRequestType( ReqNotifyIntegerAccessoryValueChanged );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryValueChanged( iStatus,
- aGenericId,
- nameRecord,
- iIntegerValue );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyIntegerAccessoryValueChanged outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::NotifyIntegerAccessoryValueChanged()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::NotifyObjectAccessoryValueChanged( TAccPolGenericID& aGenericId,
- const TUint32& aName )
- {
- if( !IsActive() )
- {
- // Cleanup old data
- iObjectValue.iValue.Zero();
-
- TAccPolNameRecord nameRecord;
- iCapabilityName = aName;
- nameRecord.SetNameL( aName );
- SetRequestType( ReqNotifyObjectAccessoryValueChanged );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryValueChanged( iStatus,
- aGenericId,
- nameRecord,
- iObjectValue );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyIntegerAccessoryValueChanged outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::GetAccessoryConnectionStatus()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::GetAccessoryConnectionStatus( TAccPolGenericIDArray& aGenericIdArray )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqGetAccessoryConnectionStatus );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryConnection->GetAccessoryConnectionStatus( iStatus,
- aGenericIdArray );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::GetAccessoryConnectionStatus outstanding" ) ) );
- }
-
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::ConnectAccessory()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::ConnectAccessory( TAccPolGenericID& aGenericId,
- TUint64 aHWDeviceID )
- {
- CAccConfigFileParser* accConfigFileParser = CAccConfigFileParser::NewL( _L("Configuration file") );
-
- TBuf<KHWModelIDMaxLength> aHWModelID;
- aHWModelID.Num( aHWDeviceID );
-
- accConfigFileParser->FindL( aGenericId, aHWDeviceID, aHWModelID );
-
- if( !IsActive() )
- {
- SetRequestType( ReqAccessoryConnection );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryControl->ConnectAccessory( iStatus,
- aGenericId );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::ConnectAccessory outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::DisconnectAccessory()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::DisconnectAccessory( TAccPolGenericID& aGenericId )
- {
- if( !IsActive() )
- {
- SetRequestType( ReqAccessoryDisconnection );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryControl->DisconnectAccessory( iStatus,
- aGenericId );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DisconnectAccessory outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-// CTFTestControlObserver::GetAccessoryMode()
-// ----------------------------------------------------------------------------------
-void CTFTestControlObserver::GetAccessoryMode()
- {
- if( !IsActive() )
- {
- SetRequestType( ReqGetAccessoryMode );
- iStatus = KRequestPending;
- iAccessoryTestControl.iAccessoryMode->GetAccessoryMode( iStatus,
- iAccMode );
- SetActive();
- TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::GetAccessoryMode outstanding" ) ) );
- }
- }
-
-//
-// ----------------------------------------------------------------------------------
-//
-// ----------------------------------------------------------------------------------
-TBool CTFTestControlObserver::FindRequest( TTFRequestType aRequest )
- {
- TBool bFound = EFalse;
-
- if( aRequest == iRequestType )
- {
- bFound = ETrue;
- }
- return bFound;
- }
-
+/*
+ * Copyright (c) 2005 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:
+ *
+ */
+
+// INCLUDE FILES
+#include <tftypes.h>
+#include "siftrace.h"
+#include "CtfTestControlObserver.h"
+#include <AccPolGIDHeader.h>
+
+const TInt CTFTestControlObserver::iOffset = _FOFF(CTFTestControlObserver,iSlink);
+
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver* CTFTestControlObserver::NewL()
+// ----------------------------------------------------------------------------------
+CTFTestControlObserver* CTFTestControlObserver::NewL( CTFAccessoryTestControl& aTestControl )
+ {
+ CTFTestControlObserver* result =
+ new ( ELeave ) CTFTestControlObserver( aTestControl );
+ result->iObjectValueBuf = HBufC8::NewL( 256 );
+ result->iObjectValue.iValue.Set( result->iObjectValueBuf->Des() );
+ CleanupStack::PushL( result );
+ CleanupStack::Pop();
+ return result;
+ }
+
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::CTFTestControlObserver()
+// ----------------------------------------------------------------------------------
+CTFTestControlObserver::CTFTestControlObserver( CTFAccessoryTestControl& aTestControl ) :
+ CActive( CActive::EPriorityHigh ),
+ iAccessoryTestControl( aTestControl ),
+ iObjectValue( TPtr8( NULL, 0, 0 ) )
+ {
+
+ iRequestCompleted = ReqAccRequestNone;
+ iCapabilityName = 0;
+
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::CTFTestControlObserver()" ) ) );
+ CActiveScheduler::Add( this );
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::CTFTestControlObserver - return" ) ) );
+ }
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::~CTFTestControlObserver()
+// ----------------------------------------------------------------------------------
+CTFTestControlObserver::~CTFTestControlObserver()
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::~CTFTestControlObserver - %d" ), iRequestType ) );
+ delete iObjectValueBuf;
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::~CTFTestControlObserver - succesful" ) ) );
+ }
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::RunL()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::RunL()
+ {
+
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL - enter" ) ) );
+
+ switch( iRequestType )
+ {
+
+ case ReqDisconnectBtAccessory:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqDisconnectBtAccessory" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqConnectBtAccessory:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqConnectBtAccessory" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqNotifyNewAccessoryConnected:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyNewAccessoryConnected" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqNotifyAccessoryDisconnected:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryDisconnected" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqNotifyAccessoryConnectionStatusChanged:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryConnectionStatusChanged" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqNotifyAccessoryModeChanged:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryModeChanged" ) ) );
+ iRequestCompleted = iRequestType;
+ iValue = iAccMode.iAccessoryMode;
+ }
+ break;
+
+ case ReqGetAccessoryMode:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqGetAccessoryMode" ) ) );
+ iRequestCompleted = iRequestType;
+ iValue = iAccMode.iAccessoryMode;
+ }
+ break;
+
+ case ReqNotifyAccessoryAudioLinkOpened:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqConnectBtAccessory" ) ) );
+ iRequestCompleted = iRequestType;
+ iValue = iAudioType;
+ }
+ break;
+
+ case ReqAccessoryAudioLinkOpen:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqConnectBtAccessory" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqNotifyBluetoothAudioLinkOpenReq:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyBluetoothAudioLinkOpenReq" ) ) );
+ iRequestCompleted = iRequestType;
+ iValue = iAudioType;
+ }
+ break;
+
+ case ReqNotifyAccessoryAudioLinkClosed:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyAccessoryAudioLinkClosed" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqAccessoryAudioLinkClose:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqAccessoryAudioLinkClose" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqNotifyBluetoothAudioLinkCloseReq:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyBluetoothAudioLinkCloseReq" ) ) );
+ iRequestCompleted = iRequestType;
+ iValue = iAudioType;
+ }
+ break;
+
+ case ReqNotifyIntegerAccessoryValueChanged:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyIntegerAccessoryValueChanged" ) ) );
+ iCapabilityName = 0;
+ iRequestCompleted = iRequestType;
+ iValue = iIntegerValue.iValue;
+ }
+ break;
+
+ case ReqNotifyBooleanAccessoryValueChanged:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqNotifyBooleanAccessoryValueChanged" ) ) );
+ iCapabilityName = 0;
+ iRequestCompleted = iRequestType;
+ iValue = ( TInt )iBooleanValue.iValue;
+ }
+ break;
+
+ case ReqNotifyObjectAccessoryValueChanged:
+ {
+ iCapabilityName = 0;
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqAccessoryConnection:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqAccessoryConnection" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqAccessoryDisconnection:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqAccessoryDisconnection" ) ) );
+ iRequestCompleted = iRequestType;
+ }
+ break;
+
+ case ReqGetAccessoryConnectionStatus:
+ {
+ COMPONENT_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL() - ReqGetAccessoryConnectionStatus" ) ) );
+ iRequestCompleted = iRequestType;
+ iValue = iAccessoryTestControl.iGenericIdArray.Count();
+ }
+ break;
+
+ default:
+ TRACE_ASSERT_ALWAYS;
+ break;
+ }
+
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::RunL - return" ) ) );
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::RunError()
+// ----------------------------------------------------------------------------------
+TInt CTFTestControlObserver::RunError( TInt aError )
+ {
+ return aError;
+ }
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::DoCancel()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::DoCancel()
+ {
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DoCancel - enter" ) ) );
+
+ switch( iRequestType )
+ {
+
+ case ReqDisconnectBtAccessory:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryBTControl->CancelDisconnectAccessory();
+ }
+ }
+ break;
+
+ case ReqConnectBtAccessory:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryBTControl->CancelConnectAccessory();
+ }
+ }
+ break;
+
+ case ReqNotifyNewAccessoryConnected:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessorySingleConnection->CancelNotifyNewAccessoryConnected();
+ }
+ }
+ break;
+
+ case ReqNotifyAccessoryDisconnected:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessorySingleConnection->CancelNotifyAccessoryDisconnected();
+ }
+ }
+ break;
+
+ case ReqNotifyAccessoryConnectionStatusChanged:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryConnection->CancelNotifyAccessoryConnectionStatusChanged();
+ }
+ }
+ break;
+
+ case ReqNotifyAccessoryModeChanged:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryMode->CancelNotifyAccessoryModeChanged();
+ }
+ }
+ break;
+
+ case ReqNotifyAccessoryAudioLinkOpened:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkOpened();
+ }
+ }
+ break;
+
+ case ReqAccessoryAudioLinkOpen:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryAudioControl->CancelAccessoryAudioLinkOpen();
+ }
+ }
+ break;
+
+ case ReqNotifyBluetoothAudioLinkOpenReq:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryBTControl->CancelNotifyBluetoothAudioLinkOpenReq();
+ }
+ }
+ break;
+
+ case ReqNotifyAccessoryAudioLinkClosed:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryAudioControl->CancelNotifyAccessoryAudioLinkClosed();
+ }
+ }
+ break;
+
+ case ReqAccessoryAudioLinkClose:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryAudioControl->CancelAccessoryAudioLinkClose();
+ }
+ }
+ break;
+
+ case ReqNotifyBluetoothAudioLinkCloseReq:
+ {
+ if( IsActive() )
+ {
+ iAccessoryTestControl.iAccessoryBTControl->CancelNotifyBluetoothAudioLinkCloseReq();
+ }
+ }
+ break;
+
+ case ReqGetAccessoryConnectionStatus:
+ {
+ //if(IsActive())
+ //{
+ //iAccessoryTestControl.iAccessoryConnection.CancelGetAccessoryConnectionStatus();
+ // }
+ }
+ break;
+
+ default:
+ TRACE_ASSERT_ALWAYS;
+ break;
+ }
+
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DoCancel - Leave" ) ) );
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyNewAccessoryConnected
+// ----------------------------------------------------------------------------------
+
+void CTFTestControlObserver::NotifyNewAccessoryConnected( TAccPolGenericID& aGenericId )
+ {
+
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyNewAccessoryConnected );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessorySingleConnection->NotifyNewAccessoryConnected( iStatus,
+ aGenericId );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyNewAccessoryConnected outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyAccessoryDisconnected
+// ----------------------------------------------------------------------------------
+
+void CTFTestControlObserver::NotifyAccessoryDisconnected( TAccPolGenericID& aGenericId )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyAccessoryDisconnected );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryDisconnected( iStatus,
+ aGenericId );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryDisconnected outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyAccessoryModeChanged
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyAccessoryModeChanged()
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyAccessoryModeChanged );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryMode->NotifyAccessoryModeChanged( iStatus,
+ iAccMode );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryModeChanged outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyAccessoryConnectionStatusChanged
+// ----------------------------------------------------------------------------------
+
+void CTFTestControlObserver::NotifyAccessoryConnectionStatusChanged( TAccPolGenericIDArray& aGenericIdArray )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyAccessoryConnectionStatusChanged );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryConnection->NotifyAccessoryConnectionStatusChanged( iStatus,
+ aGenericIdArray );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryConnectionStatusChanged outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::AccessoryAudioLinkOpen()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::AccessoryAudioLinkOpen( TAccPolGenericID& aGenericId,
+ TUint32 aAudioType )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqAccessoryAudioLinkOpen );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryAudioControl->AccessoryAudioLinkOpen( iStatus,
+ aGenericId,
+ ( TAccAudioType )aAudioType );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::AccessoryAudioLinkOpen outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyAccessoryAudioLinkOpened
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyAccessoryAudioLinkOpened( TAccPolGenericID& aGenericId )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyAccessoryAudioLinkOpened );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryAudioControl->NotifyAccessoryAudioLinkOpened( iStatus,
+ aGenericId,
+ iAudioType );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryAudioLinkOpened outstanding" ) ) );
+ }
+ }
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyAccessoryAudioLinkClosed
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyAccessoryAudioLinkClosed( TAccPolGenericID& aGenericId )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyAccessoryAudioLinkClosed );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryAudioControl->NotifyAccessoryAudioLinkClosed( iStatus,
+ aGenericId,
+ iAudioType );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyAccessoryAudioLinkClosed outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::AccessoryAudioLinkClose
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::AccessoryAudioLinkClose( TAccPolGenericID& aGenericId,
+ TUint32 aAudioType )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqAccessoryAudioLinkClose );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryAudioControl->AccessoryAudioLinkClose( iStatus,
+ aGenericId,
+ ( TAccAudioType )aAudioType );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::AccessoryAudioLinkClose outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyBluetoothAudioLinkOpenReq
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyBluetoothAudioLinkOpenReq()
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyBluetoothAudioLinkOpenReq );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryBTControl->NotifyBluetoothAudioLinkOpenReq( iStatus,
+ iBTaddr,
+ iAudioType );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyBluetoothAudioLinkOpenReq outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyBluetoothAudioLinkCloseReq
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyBluetoothAudioLinkCloseReq()
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqNotifyBluetoothAudioLinkCloseReq );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryBTControl->NotifyBluetoothAudioLinkCloseReq( iStatus,
+ iBTaddr,
+ iAudioType );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyBluetoothAudioLinkCloseReq outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::ConnectBTAccessory()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::ConnectBTAccessory( TBTDevAddr& btaddr )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqConnectBtAccessory );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryBTControl->ConnectAccessory( iStatus,
+ btaddr );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::ConnectBTAccessory outstanding" ) ) );
+ }
+
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::DisconnectBTAccessory()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::DisconnectBTAccessory( TBTDevAddr& btaddr )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqDisconnectBtAccessory );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryBTControl->DisconnectAccessory( iStatus,
+ btaddr );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DisconnectBTAccessory outstanding" ) ) );
+ }
+
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyBooleanAccessoryValueChanged()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyBooleanAccessoryValueChanged( TAccPolGenericID& aGenericId,
+ const TUint32& aName )
+ {
+ if( !IsActive() )
+ {
+ TAccPolNameRecord nameRecord;
+ iCapabilityName = aName;
+ nameRecord.SetNameL( aName );
+ SetRequestType( ReqNotifyBooleanAccessoryValueChanged );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryValueChanged( iStatus,
+ aGenericId,
+ nameRecord,
+ iBooleanValue );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyBooleanAccessoryValueChanged outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyIntegerAccessoryValueChanged()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyIntegerAccessoryValueChanged( TAccPolGenericID& aGenericId,
+ const TUint32& aName )
+ {
+ if( !IsActive() )
+ {
+ TAccPolNameRecord nameRecord;
+ iCapabilityName = aName;
+ nameRecord.SetNameL( aName );
+ SetRequestType( ReqNotifyIntegerAccessoryValueChanged );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryValueChanged( iStatus,
+ aGenericId,
+ nameRecord,
+ iIntegerValue );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyIntegerAccessoryValueChanged outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::NotifyIntegerAccessoryValueChanged()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::NotifyObjectAccessoryValueChanged( TAccPolGenericID& aGenericId,
+ const TUint32& aName )
+ {
+ if( !IsActive() )
+ {
+ // Cleanup old data
+ iObjectValue.iValue.Zero();
+
+ TAccPolNameRecord nameRecord;
+ iCapabilityName = aName;
+ nameRecord.SetNameL( aName );
+ SetRequestType( ReqNotifyObjectAccessoryValueChanged );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessorySingleConnection->NotifyAccessoryValueChanged( iStatus,
+ aGenericId,
+ nameRecord,
+ iObjectValue );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::NotifyIntegerAccessoryValueChanged outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::GetAccessoryConnectionStatus()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::GetAccessoryConnectionStatus( TAccPolGenericIDArray& aGenericIdArray )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqGetAccessoryConnectionStatus );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryConnection->GetAccessoryConnectionStatus( iStatus,
+ aGenericIdArray );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::GetAccessoryConnectionStatus outstanding" ) ) );
+ }
+
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::ConnectAccessory()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::ConnectAccessory( TAccPolGenericID& aGenericId,
+ TUint64 aHWDeviceID )
+ {
+ CAccConfigFileParser* accConfigFileParser = CAccConfigFileParser::NewL( _L("Configuration file") );
+
+ TBuf<KHWModelIDMaxLength> aHWModelID;
+ aHWModelID.Num( aHWDeviceID );
+
+ CleanupStack::PushL( accConfigFileParser );
+ accConfigFileParser->FindL( aGenericId, aHWDeviceID, aHWModelID );
+ CleanupStack::Pop( accConfigFileParser );
+
+ if( !IsActive() )
+ {
+ SetRequestType( ReqAccessoryConnection );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryControl->ConnectAccessory( iStatus,
+ aGenericId );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::ConnectAccessory outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::DisconnectAccessory()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::DisconnectAccessory( TAccPolGenericID& aGenericId )
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqAccessoryDisconnection );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryControl->DisconnectAccessory( iStatus,
+ aGenericId );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::DisconnectAccessory outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+// CTFTestControlObserver::GetAccessoryMode()
+// ----------------------------------------------------------------------------------
+void CTFTestControlObserver::GetAccessoryMode()
+ {
+ if( !IsActive() )
+ {
+ SetRequestType( ReqGetAccessoryMode );
+ iStatus = KRequestPending;
+ iAccessoryTestControl.iAccessoryMode->GetAccessoryMode( iStatus,
+ iAccMode );
+ SetActive();
+ TEST_CASE_TRACE( ( _L( "ACCESSORYTESTCONTROL - CTFTestControlObserver::GetAccessoryMode outstanding" ) ) );
+ }
+ }
+
+//
+// ----------------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------------
+TBool CTFTestControlObserver::FindRequest( TTFRequestType aRequest )
+ {
+ TBool bFound = EFalse;
+
+ if( aRequest == iRequestType )
+ {
+ bFound = ETrue;
+ }
+ return bFound;
+ }
+
--- a/accessoryservices/accessoryserver/tsrc/public/basic/Stubs/AsyStub/src/AsyStubCmdHandlerBase.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/accessoryserver/tsrc/public/basic/Stubs/AsyStub/src/AsyStubCmdHandlerBase.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -249,6 +249,7 @@
//get capabilities
CAccPolSubblockNameArray* iNameArray =
CAccPolSubblockNameArray::NewL();
+ CleanupStack::PushL( iNameArray );
RAccessoryServer server;
server.Connect();
@@ -281,7 +282,7 @@
connectionBase.CloseSubSession();
server.Close();
- delete iNameArray;
+ CleanupStack::PopAndDestroy( iNameArray );
// If everything is ok
if( everyThing )
--- a/accessoryservices/accessoryserver/tsrc/public/basic/Stubs/AsyStub/src/AsyStubService.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/accessoryserver/tsrc/public/basic/Stubs/AsyStub/src/AsyStubService.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -27,7 +27,7 @@
#include <accpolobjecttypes.h>
#include <s32mem.h>
#include <accpolhdmiobjectcon.h>
-#include <accessoryservicesinternalpskeys.h>
+#include <accessoryservicespskeys.h>
#ifdef FF_AUTOMOTIVESTACK
#include <autoaudiopskeys.h>
#endif
@@ -107,6 +107,7 @@
TBuf<12> HWModelID;
HWModelID.Num( aParam1 );
+ CleanupStack::PushL( accConfigFileParser );
__UHEAP_MARK;
CAccConGenericID* genericID = CAccConGenericID::NewL();
CleanupStack::PushL( genericID );
@@ -121,7 +122,7 @@
iGenericId = genericID->GenericID();
CleanupStack::PopAndDestroy( genericID );
__UHEAP_MARKEND;
- delete accConfigFileParser;
+ CleanupStack::PopAndDestroy( accConfigFileParser );
__UHEAP_MARKEND;
}
break;
@@ -137,7 +138,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -183,12 +186,11 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Connect status %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
}
break;
@@ -198,7 +200,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -262,12 +266,11 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Update status %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
}
break;
@@ -277,7 +280,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -324,12 +329,11 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Update status %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
}
break;
@@ -339,7 +343,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -390,12 +396,11 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Update status %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
}
break;
@@ -405,7 +410,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -475,12 +482,11 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Update status %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
}
break;
@@ -596,7 +602,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -664,12 +672,11 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Update status for USB %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
}
;
break;
@@ -680,7 +687,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -773,15 +782,14 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Update status for USB %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( audioStream2 );//
CleanupStack::PopAndDestroy( audioStream1 );//
CleanupStack::PopAndDestroy( stream );//
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
}
;
break;
@@ -791,7 +799,9 @@
CAccConfigFileParser* accConfigFileParser =
CAccConfigFileParser::NewL( _L("Configuration file") );
+ CleanupStack::PushL( accConfigFileParser );
CAccConGenericID* genericID = CAccConGenericID::NewL();
+ CleanupStack::PushL( genericID );
RArray<TAccPolNameValueRecord> nameValueArray;
CleanupClosePushL( nameValueArray );
@@ -845,12 +855,11 @@
TInt retval = status.Int();
COMPONENT_TRACE( ( _L( "ASYSTUB - CASYStubService::Service - Update status %d" ), retval) );
- delete accConfigFileParser;
iGenericId = genericID->GenericID();
- delete genericID;
CleanupStack::PopAndDestroy( &nameValueArray );//nameValueArray.Close() is called;
+ CleanupStack::PopAndDestroy( 2, accConfigFileParser );
break;
}
--- a/accessoryservices/autoaudioasy/src/cautoaudioasymainservicebase.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/autoaudioasy/src/cautoaudioasymainservicebase.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -15,7 +15,7 @@
*
*/
// global headers
-#include <accessoryservicesinternalpskeys.h>
+#include <accessoryservicespskeys.h>
#include <autoaudiopskeys.h>
// local headers
--- a/accessoryservices/autoaudioasy/src/cautoaudioasyservice.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/accessoryservices/autoaudioasy/src/cautoaudioasyservice.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -20,7 +20,7 @@
#include <accpolnamevaluerecord.h>
#include <accconfigfileparser.h>
#include <accpolcommonnamevaluepairs.h>
-#include <accessoryservicesinternalpskeys.h>
+#include <accessoryservicespskeys.h>
#include <autoaudiopskeys.h>
#include "cautoaudioasyservice.h"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicesrv_plat/common_accessory_plugin_api/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2008 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: Exports the files of Automotive Audio Plugin API.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../inc/accessoryservicespskeys.h OS_LAYER_PLATFORM_EXPORT_PATH(accessoryservicespskeys.h)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devicesrv_plat/common_accessory_plugin_api/inc/accessoryservicespskeys.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2008 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: Publish&Subscribe definitions of the
+* Accessory Services
+*
+*/
+
+
+#ifndef ACCESSORYSERVICESPSKEYS_H
+#define ACCESSORYSERVICESPSKEYS_H
+
+#include <e32cmn.h>
+
+static const TUid KPSUidAccessoryServices = { 0x10205030 };
+
+// =============================================================================
+// Accessory Services Wired Connection API
+// =============================================================================
+// Use TUid KPSUidAccessoryServices = { 0x10205030 }
+
+/**
+* Notified when a wired accessory is physically connected or disconnected.
+*/
+const TUint32 KAccSrvcsWiredConnection = 0x00000001;
+enum TAccSrvcsWiredConnection
+ {
+ EAccSrvcsWiredConnUninitialized = 0,
+ EAccSrvcsWiredConnConnected,
+ EAccSrvcsWiredConnDisconnected
+ };
+
+
+#endif ACCESSORYSERVICESPSKEYS_H
--- a/devicesrv_plat/group/bld.inf Wed Sep 29 15:13:21 2010 +0300
+++ b/devicesrv_plat/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -68,6 +68,7 @@
#include "../sensor_data_compensator_plugin_api/group/bld.inf"
#include "../ddc_access_api/group/bld.inf"
#include "../tv_out_behaviour_api/group/bld.inf"
+#include "../common_accessory_plugin_api/group/bld.inf"
#ifdef FF_AUTOMOTIVESTACK
#include "../autoaudio_plugin_api/group/bld.inf"
#endif
--- a/devicesrv_pub/sensor_channel_api/tsrc/sensor/src/SensrvTestBlocks.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/devicesrv_pub/sensor_channel_api/tsrc/sensor/src/SensrvTestBlocks.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1224,7 +1224,8 @@
ESensrvOperatorLessThanOrEquals,
3,
dataBufX);
-
+
+ CleanupStack::PushL(testCondition);
TPckgBuf<TSensrvAccelerometerAxisData> getBuf;
User::LeaveIfError(testCondition->GetConditionValue(getBuf));
TSensrvAccelerometerAxisData getItem1 = getBuf();
@@ -1298,6 +1299,8 @@
RDebug::Print( _L("CSensrvTestCases::ConditionUnitTestL - Overall time for %d ConditionValue %d microseconds"), i, overallTime2.Int64() );
RDebug::Print( _L("CSensrvTest::ConditionUnitTestL - Completed: %d"), err );
+
+ CleanupStack::PopAndDestroy(testCondition);
return err;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,26 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Build definition.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_MMPFILES
+hapticstest.mmp
+
+PRJ_EXPORTS
+../rom/hapticstest.iby CORE_APP_LAYER_IBY_EXPORT_PATH(hapticstest.iby)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/group/hapticstest.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,100 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: MMP-file for the hapticstest application.
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+CAPABILITY ReadDeviceData
+
+VENDORID VID_DEFAULT
+
+
+#ifdef __UI_FRAMEWORKS_V2__
+TARGETPATH /sys/bin
+#if defined(EKA2) || !defined(WINS)
+TARGET hapticstest.exe
+TARGETTYPE exe
+#else // EKA1 WINS
+TARGET hapticstest.app
+TARGETTYPE exedll
+deffile /epoc32/release/wins/hapticstest.def
+#endif
+#else // __UI_FRAMEWORKS_V2__
+TARGET hapticstest.app
+TARGETPATH /system/apps/hapticstest
+TARGETTYPE app
+#endif
+
+UID 0x100039CE 0x0AD0595A
+
+LANG SC
+
+SOURCEPATH ../src
+SOURCE hapticstest.cpp
+SOURCE hapticstestapplication.cpp
+SOURCE hapticstestappview.cpp
+SOURCE hapticstestappUi.cpp
+SOURCE hapticstestdocument.cpp
+SOURCE hapticstesteffectdatahandler.cpp
+SOURCE hapticstestasyncplaysender.cpp
+
+SOURCEPATH ../group
+
+
+USERINCLUDE ../inc
+APP_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY apparc.lib
+LIBRARY cone.lib
+LIBRARY eikcore.lib
+LIBRARY avkon.lib
+LIBRARY eikcoctl.lib
+LIBRARY eikctl.lib
+LIBRARY etext.lib
+LIBRARY ws32.lib
+LIBRARY gdi.lib
+LIBRARY egul.lib
+LIBRARY efsrv.lib
+LIBRARY hwrmhapticsclient.lib
+LIBRARY charconv.lib // CnvUtfConverter
+
+
+#ifdef __UI_FRAMEWORKS_V2__
+START RESOURCE hapticstest.RSS
+HEADER
+targetpath /resource/apps
+lang sc
+end
+#else
+RESOURCE hapticstest.RSS
+#endif
+
+#ifdef __UI_FRAMEWORKS_V2__
+sourcepath .
+START RESOURCE hapticstest_reg.rss
+TARGETPATH /private/10003a3f/import/apps
+END
+
+start resource hapticstest_loc.RSS
+targetpath /resource/apps
+lang sc
+end
+#endif
+
+SMPSAFE
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/group/hapticstest.rss Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,694 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Application resource file.
+*
+*/
+
+
+NAME HAPT
+
+#include <eikon.rh>
+#include <eikon.rsg>
+#include <avkon.rh>
+#include <avkon.rsg>
+
+#include "hapticstest.hrh"
+
+
+// ---------------------------------------------------------
+//
+// Define the resource file signature
+// This resource should be empty.
+//
+// ---------------------------------------------------------
+//
+RESOURCE RSS_SIGNATURE { }
+
+// ---------------------------------------------------------
+//
+// Default Document Name
+//
+// ---------------------------------------------------------
+//
+RESOURCE TBUF r_default_document_name { buf=""; }
+
+// ---------------------------------------------------------
+//
+// Define default menu and CBA key.
+//
+// ---------------------------------------------------------
+//
+RESOURCE EIK_APP_INFO
+ {
+ menubar = r_hapticstest_menubar;
+ cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_menubar
+// Menubar for hapticstest example
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_BAR r_hapticstest_menubar
+ {
+ titles =
+ {
+ MENU_TITLE {menu_pane = r_hapticstest_menu;}
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_menu
+// Menu for "Options"
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_menu
+ {
+ items =
+ {
+ MENU_ITEM {cascade = r_hapticstest_init_submenu; command = EHapticsTestInit; txt = "Initialize";},
+ MENU_ITEM {cascade = r_hapticstest_reserve_submenu; command = EHapticsTestReserve; txt = "Reserve/Release";},
+ MENU_ITEM {cascade = r_hapticstest_ivtfiles_submenu; command = EHapticsTestLoadIVTFile; txt = "Load IVT-file";},
+ MENU_ITEM {cascade = r_hapticstest_generalplay_submenu; command = EHapticsTestGeneralPlayEffect; txt = "Play Effect";},
+ MENU_ITEM {cascade = r_hapticstest_changestate_submenu; command = EHapticsTestChangeState; txt = "Pause/Resume/Stop";},
+ MENU_ITEM {cascade = r_hapticstest_modify_submenu; command = EHapticsTestModifyEffect; txt = "Modify Effect";},
+ MENU_ITEM {cascade = r_hapticstest_deleteivtdata_submenu; command = EHapticsTestDeleteIVTData; txt = "Delete IVT data";},
+ MENU_ITEM {cascade = r_hapticstest_toggle_submenu; command = EHapticsToggle; txt = "Toggle conf";},
+ MENU_ITEM {cascade = r_hapticstest_properties_submenu; command=EHapticsTestPropertiesSubmenu; txt = "Properties";},
+ MENU_ITEM {cascade = r_hapticstest_capabilities_submenu; command=EHapticsTestCapabilitiesSubmenu; txt = "Capabilities";},
+ MENU_ITEM {command = EHapticsTestGetStatus; txt = "Print haptics status";},
+ MENU_ITEM {command = EHapticsTestStreaming; txt = "Start streaming";},
+ MENU_ITEM {command = EHapticsTestPlayStreamSample; txt = "Play sample";},
+ MENU_ITEM {command = EHapticsTestNextStreamSample; txt = "Next sample";},
+ MENU_ITEM {command = EHapticsTestPlayAllSamples; txt = "Play whole effect";},
+ MENU_ITEM {command = EHapticsTestStopStreaming; txt = "Stop streaming";},
+ MENU_ITEM {command = EHapticsTestDeleteAllIVTData; txt = "Delete all IVT data";},
+ MENU_ITEM {command = EHapticsTestConstGetters; txt = "Const getters";},
+ MENU_ITEM {command = EHapticsTestClearOutput; txt = "Clear output";},
+ MENU_ITEM {command = EHapticsTestPanic; txt = "Panic!";},
+ MENU_ITEM {command = EAknSoftkeyExit; txt = "Exit";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_init_submenu
+// Submenu for initializing haptics.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_init_submenu
+ {
+ items =
+ {
+ MENU_ITEM {cascade = r_hapticstest_openclose_submenu; txt = "Open/Close";},
+ MENU_ITEM {cascade = r_hapticstest_actuators_submenu; command = EHapticsTestOpenActuator; txt = "Open Actuator";},
+ MENU_ITEM {command = EHapticsTestSupportedActuators; txt = "Supported Actuators";},
+ MENU_ITEM {command = EHapticsTestAutoInit; txt = "AutoInit";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_openclose_submenu
+// Submenu for opening and closing a haptics client.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_openclose_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestOpenHaptics; txt = "Open client";},
+ MENU_ITEM {command = EHapticsTestCloseHaptics; txt = "Close client";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_actuators_submenu
+// Submenu for opening an actuator.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_actuators_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestOpenActuatorAny; txt = "Any";},
+ MENU_ITEM {command = EHapticsTestOpenActuatorDevice; txt = "Device";},
+ MENU_ITEM {command = EHapticsTestOpenActuatorPrimaryDisplay; txt = "Primary Display";},
+ MENU_ITEM {command = EHapticsTestOpenActuatorSecondaryDisplay; txt = "Secondary Display";},
+ MENU_ITEM {command = EHapticsTestOpenActuatorGame; txt = "Game";},
+ MENU_ITEM {command = EHapticsTestOpenActuatorGameLeft; txt = "Game Left";},
+ MENU_ITEM {command = EHapticsTestOpenActuatorGameRight; txt = "Game Right";},
+ MENU_ITEM {command = EHapticsTestOpenActuatorExternalVibra; txt = "External Vibra";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_ivtfiles_submenu
+// Submenu for loading an ivt-file.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_ivtfiles_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestLoadIVTFileNoneFound; txt = "<No IVT-files found>";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_deleteivtdata_submenu
+// Submenu for deleting loaded ivt-files from haptics
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_deleteivtdata_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestDeleteIVTDataNoneFound; txt = "<No IVT-files found>";}
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_generalplay_submenu
+// Submenu for playing effects (ivt, repeat, manual).
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_generalplay_submenu
+ {
+ items =
+ {
+ MENU_ITEM {cascade = r_hapticstest_playeffect_submenu; command = EHapticsTestPlayEffect; txt = "Play";},
+ MENU_ITEM {cascade = r_hapticstest_playeffectrepeat_submenu; command = EHapticsTestPlayEffectRepeat; txt = "Repeat";},
+ MENU_ITEM {cascade = r_hapticstest_playeffectdef_submenu; command = EHapticsTestPlayEffectManual; txt = "Manual";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_playeffect_submenu
+// Submenu for playing an effect using IVT-data.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_playeffect_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestPlayEffectNoneFound; txt = "<No effects found>";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_repeateffect_submenu
+// Submenu for repeating an effect using IVT-data.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_playeffectrepeat_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestPlayEffectRepeatNoneFound; txt = "<No effects found>";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_playeffectdef_submenu
+// Submenu for playing manual effect (magsweep/periodic/repeat).
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_playeffectdef_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestPlayEffectManualMagSweep; txt = "MagSweep (1 sec)";},
+ MENU_ITEM {command = EHapticsTestPlayEffectManualMagSweepInf; txt = "MagSweep (inf)";},
+ MENU_ITEM {command = EHapticsTestPlayEffectManualMagSweepInfMod; txt = "MagSweep (mod)";},
+ MENU_ITEM {command = EHapticsTestPlayEffectManualPeriodic; txt = "Periodic (1 sec)";},
+ MENU_ITEM {command = EHapticsTestPlayEffectManualPeriodicInf; txt = "Periodic (inf)";},
+ MENU_ITEM {command = EHapticsTestPlayEffectManualPeriodicInfMod; txt = "Periodic (mod)";},
+ MENU_ITEM {command = EHapticsTestPlayEffectManualRepeat; txt = "Repeat";}
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_changestate_submenu
+// Submenu for pause, resume and stop effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_changestate_submenu
+ {
+ items =
+ {
+ MENU_ITEM {cascade = r_hapticstest_pause_submenu; txt = "Pause";},
+ MENU_ITEM {cascade = r_hapticstest_resume_submenu; txt = "Resume";},
+ MENU_ITEM {cascade = r_hapticstest_stop_submenu; txt = "Stop";},
+ MENU_ITEM {command = EHapticsTestChangeStateStopAll; txt = "Stop all effects";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_pause_submenu
+// Submenu for pause.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_pause_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestChangeStateNoneFound; txt = "<No effects found>";}
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_resume_submenu
+// Submenu for resume.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_resume_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestChangeStateNoneFound; txt = "<No effects found>";}
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_stop_submenu
+// Submenu for stop.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_stop_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestChangeStateNoneFound; txt = "<No effects found>";}
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modify_submenu
+// Submenu for modifying an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modify_submenu
+ {
+ items =
+ {
+ MENU_ITEM {cascade = r_hapticstest_modifyduration_submenu; txt = "Duration";},
+ MENU_ITEM {cascade = r_hapticstest_modifymagnitude_submenu; txt = "Magnitude";},
+ MENU_ITEM {cascade = r_hapticstest_modifystyle_submenu; txt = "Style";},
+ MENU_ITEM {cascade = r_hapticstest_modifyattack_submenu; txt = "Attack level";},
+ MENU_ITEM {cascade = r_hapticstest_modifyfade_submenu; txt = "Fade level";},
+ MENU_ITEM {cascade = r_hapticstest_modifyattacktime_submenu; txt = "Attack time";},
+ MENU_ITEM {cascade = r_hapticstest_modifyfadetime_submenu; txt = "Fade time";},
+ MENU_ITEM {cascade = r_hapticstest_modifyperiod_submenu; txt = "Period";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifyduration_submenu
+// Submenu for modifying duration of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifyduration_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectDuration1; txt = "1s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectDuration5; txt = "5s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectDuration10; txt = "10s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectDuration30; txt = "30s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectDuration60; txt = "60s"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifymagnitude_submenu
+// Submenu for modifying magnitude of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifymagnitude_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectMagnitudeMin; txt = "Min"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectMagnitude25; txt = "25%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectMagnitude50; txt = "50%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectMagnitude75; txt = "75%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectMagnitudeMax; txt = "Max"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifystyle_submenu
+// Submenu for modifying the style of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifystyle_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectStyleSmooth; txt = "Smooth"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectStyleStrong; txt = "Strong"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectStyleSharp; txt = "Sharp"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifyattack_submenu
+// Submenu for modifying attack level of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifyattack_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackMin; txt = "Min"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttack25; txt = "25%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttack50; txt = "50%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttack75; txt = "75%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackMax; txt = "Max"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifyfade_submenu
+// Submenu for modifying fadelevel of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifyfade_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeMin; txt = "Min"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFade25; txt = "25%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFade50; txt = "50%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFade75; txt = "75%"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeMax; txt = "Max"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifyattacktime_submenu
+// Submenu for modifying attack time of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifyattacktime_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackTime02; txt = "0.2s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackTime1; txt = "1s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackTime5; txt = "5s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackTime10; txt = "10s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackTime30; txt = "30s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectAttackTime60; txt = "60s"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifyfadetime_submenu
+// Submenu for modifying fade time of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifyfadetime_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeTime02; txt = "0.2s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeTime1; txt = "1s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeTime5; txt = "5s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeTime10; txt = "10s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeTime30; txt = "30s"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectFadeTime60; txt = "60s"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_modifyperiod_submenu
+// Submenu for modifying period of an effect.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_modifyperiod_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestModifyEffectPeriod50; txt = "50ms"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectPeriod100; txt = "100ms"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectPeriod300; txt = "300ms"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectPeriod600; txt = "600ms"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectPeriod1000; txt = "1000ms"; flags = EEikMenuItemCheckBox;},
+ MENU_ITEM {command = EHapticsTestModifyEffectPeriod3000; txt = "3000ms"; flags = EEikMenuItemCheckBox;}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_reserve_submenu
+// Submenu for reserving haptics.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_reserve_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestReserveNotTrusted; txt = "Reserve untrusted";},
+ MENU_ITEM {command = EHapticsTestReserveTrusted; txt = "Reserve trusted";},
+ MENU_ITEM {command = EHapticsTestRelease; txt = "Release haptics"; },
+ MENU_ITEM {command = EHapticsTestReserveNotTrustedTemp; txt = "Reserve temporary";},
+ MENU_ITEM {command = EHapticsTestReleaseTemp; txt = "Release temporary"; }
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_toggle_submenu
+// Submenu for toggling configuration.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_toggle_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestSynchronousCalls; txt = "Synchronous methods";},
+ MENU_ITEM {command = EHapticsTestAsynchronousCalls; txt = "Asynchronous methods";},
+ MENU_ITEM {command = EHapticsTestUsingFileHandle; txt = "Use file handle";},
+ MENU_ITEM {command = EHapticsTestNotUsingFileHandle; txt = "Use data buffer";},
+ MENU_ITEM {command = EHapticsTestShowEffectInfo; txt = "Show played effect info";},
+ MENU_ITEM {command = EHapticsTestHideEffectInfo; txt = "Don't show effect info";}
+ };
+ }
+
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_properties_submenu
+// Submenu for properties.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_properties_submenu
+ {
+ items =
+ {
+ //getters
+ MENU_ITEM {command = EHapticsTestGetPropertyPriority; txt = "Get Priority";},
+ MENU_ITEM {command = EHapticsTestGetPropertyDisableEffects; txt = "Check Disable effects";},
+ MENU_ITEM {command = EHapticsTestGetPropertyStrength; txt = "Get Strength";},
+ //setters
+ MENU_ITEM {cascade = r_hapticstest_properties_set__priority_submenu; txt = "Priority";},
+ MENU_ITEM {cascade = r_hapticstest_properties_set__disableeffects_submenu; txt = "DisableEffects";},
+ MENU_ITEM {cascade = r_hapticstest_properties_set__strength_submenu; txt = "Strength";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_properties_set__priority_submenu
+// Submenu for setting priority property
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_properties_set__priority_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestSetPropertyPriorityMin; txt = "Min";},
+ MENU_ITEM {command = EHapticsTestSetPropertyPriorityDefault; txt = "Default";},
+ MENU_ITEM {command = EHapticsTestSetPropertyPriorityMax; txt = "Max";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_properties_set__disableeffects_submenu
+// Submenu for setting disable effects property.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_properties_set__disableeffects_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestSetPropertyDisableEffectsTrue; txt = "True";},
+ MENU_ITEM {command = EHapticsTestSetPropertyDisableEffectsFalse; txt = "False";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_properties_set__strength_submenu
+// Submenu for setting strength property.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_properties_set__strength_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestSetPropertyStrengthMute; txt = "Mute";},
+ MENU_ITEM {command = EHapticsTestSetPropertyStrengthHalf; txt = "Half";},
+ MENU_ITEM {command = EHapticsTestSetPropertyStrengthFull; txt = "Full";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// r_hapticstest_getcapabilities_submenu
+// Submenu for capabilities.
+//
+// ---------------------------------------------------------
+//
+RESOURCE MENU_PANE r_hapticstest_capabilities_submenu
+ {
+ items =
+ {
+ MENU_ITEM {command = EHapticsTestGetCapabilityDeviceCategory; txt = "Device Category";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityMaxNestedRepeats; txt = "Max nested actuators";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityNumActuators; txt = "Number of actuators";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityActuatorType; txt = "Actuator type";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityNumEffectSlots; txt = "Effect slots";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityNumEffectStyles; txt = "Effect styles";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityMinPeriod; txt = "Min period";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityMaxPeriod; txt = "Max period";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityMaxEffectDuration; txt = "Max effectt duration";},
+ MENU_ITEM {command = EHapticsTestGetCapabilitySupportedEffects; txt = "Supported effects";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityDeviceName; txt = "Device Name";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityAPIVersionNumber;txt = "API version number";},
+ MENU_ITEM {command = EHapticsTestGetCapabilityMaxIVTSize;txt = "Max IVT file size";}
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// Array of selections for number of repeats in "repeat effect"
+// cases..
+//
+// ---------------------------------------------------------
+//
+RESOURCE ARRAY r_haptics_repeateffect_repeats_list
+ {
+ items =
+ {
+ LBUF {txt = "0 repeats"; },
+ LBUF {txt = "1 repeat"; },
+ LBUF {txt = "2 repeats"; },
+ LBUF {txt = "3 repeats"; },
+ LBUF {txt = "7 repeats"; },
+ LBUF {txt = "Inf repeats"; }
+ };
+ }
+
+// ---------------------------------------------------------
+//
+// List query resource for number of repeats in "repeat effect"
+// cases..
+//
+// ---------------------------------------------------------
+//
+RESOURCE AVKON_LIST_QUERY r_haptics_repeateffect_repeats_query
+ {
+ softkeys = R_AVKON_SOFTKEYS_OK_CANCEL;
+
+ items =
+ {
+ AVKON_LIST_QUERY_DLG_LINE
+ {
+ control = AVKON_LIST_QUERY_CONTROL
+ {
+ listtype = EAknCtSinglePopupMenuListBox;
+ listbox = AVKON_LIST_QUERY_LIST
+ {
+ array_id = r_haptics_repeateffect_repeats_list;
+ };
+ heading = "Repeats";
+ };
+ }
+ };
+ }
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/group/hapticstest_loc.rls Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,22 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Localization file.
+*
+*/
+
+
+//rls_string STRING_r_hapticstest_icon_path "z:\\resource\\apps\\hapticstesticon.mbm"
+rls_string STRING_short_caption "hapticstest"
+rls_string STRING_r_hapticstest_caption "hapticstest"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/group/hapticstest_loc.rss Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,37 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Localization resource file.
+*
+*/
+
+
+#include <appinfo.rh>
+#include "hapticstest_loc.rls"
+
+RESOURCE LOCALISABLE_APP_INFO
+ {
+ short_caption = STRING_short_caption;
+ caption_and_icon =
+ {
+ CAPTION_AND_ICON_INFO
+ {
+ caption=STRING_r_hapticstest_caption;
+ //number_of_icons=3;
+ //icon_file=STRING_r_hapticstest_icon_path;
+ }
+ };
+ }
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/group/hapticstest_reg.rss Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,32 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Application registration file.
+*
+*/
+
+
+//hapticstest application's registration resource file
+
+#include <appinfo.rh>
+
+UID2 KUidAppRegistrationResourceFile
+UID3 0x0AD0595A
+
+RESOURCE APP_REGISTRATION_INFO
+ {
+ app_file="hapticstest";
+ //
+ localisable_resource_file="\\resource\\apps\\hapticstest_loc";
+ //
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstest.hrh Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,166 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Defines options menu commands.
+*
+*/
+
+
+#ifndef __hapticstest_HRH__
+#define __hapticstest_HRH__
+
+/** hapticstest enumerate command codes */
+enum THapticsTestIds
+ {
+ EHapticsTestOpenHaptics = 1, // start value must not be 0
+ EHapticsTestAutoInit,
+ EHapticsTestSupportedActuators,
+ EHapticsTestOpenActuator, // for submenu
+ EHapticsTestOpenActuatorAny,
+ EHapticsTestOpenActuatorDevice,
+ EHapticsTestOpenActuatorPrimaryDisplay,
+ EHapticsTestOpenActuatorSecondaryDisplay,
+ EHapticsTestOpenActuatorGame,
+ EHapticsTestOpenActuatorGameLeft,
+ EHapticsTestOpenActuatorGameRight,
+ EHapticsTestOpenActuatorExternalVibra,
+ EHapticsTestLoadIVTFile, // for submenu
+ EHapticsTestLoadIVTFileNoneFound,
+ EHapticsTestLoadIVTFileSelected,
+ EHapticsTestGeneralPlayEffect, // for submenu
+ EHapticsTestPlayEffect, // for submenu
+ EHapticsTestPlayEffectNoneFound,
+ EHapticsTestPlayEffectSelected,
+ EHapticsTestPlayEffectRepeat, // for submenu
+ EHapticsTestPlayEffectRepeatNoneFound,
+ EHapticsTestPlayEffectRepeatSelected,
+ EHapticsTestPlayEffectManual, // for submenu
+ EHapticsTestPlayEffectManualMagSweep,
+ EHapticsTestPlayEffectManualMagSweepInf,
+ EHapticsTestPlayEffectManualMagSweepInfMod,
+ EHapticsTestPlayEffectManualPeriodic,
+ EHapticsTestPlayEffectManualPeriodicInf,
+ EHapticsTestPlayEffectManualPeriodicInfMod,
+ EHapticsTestPlayEffectManualRepeat,
+ EHapticsTestChangeState, // submenu
+ EHapticsTestChangeStateNoneFound,
+ EHapticsTestChangeStatePause,
+ EHapticsTestChangeStateResume,
+ EHapticsTestChangeStateStop,
+ EHapticsTestChangeStateStopAll,
+ EHapticsTestModifyEffect, // submenu
+ EHapticsTestModifyEffectDuration1,
+ EHapticsTestModifyEffectDuration5,
+ EHapticsTestModifyEffectDuration10,
+ EHapticsTestModifyEffectDuration30,
+ EHapticsTestModifyEffectDuration60,
+ EHapticsTestModifyEffectMagnitudeMin,
+ EHapticsTestModifyEffectMagnitude25,
+ EHapticsTestModifyEffectMagnitude50,
+ EHapticsTestModifyEffectMagnitude75,
+ EHapticsTestModifyEffectMagnitudeMax,
+ EHapticsTestModifyEffectStyleSmooth,
+ EHapticsTestModifyEffectStyleStrong,
+ EHapticsTestModifyEffectStyleSharp,
+ EHapticsTestModifyEffectAttackMin,
+ EHapticsTestModifyEffectAttack25,
+ EHapticsTestModifyEffectAttack50,
+ EHapticsTestModifyEffectAttack75,
+ EHapticsTestModifyEffectAttackMax,
+ EHapticsTestModifyEffectFadeMin,
+ EHapticsTestModifyEffectFade25,
+ EHapticsTestModifyEffectFade50,
+ EHapticsTestModifyEffectFade75,
+ EHapticsTestModifyEffectFadeMax,
+ EHapticsTestModifyEffectAttackTime02,
+ EHapticsTestModifyEffectAttackTime1,
+ EHapticsTestModifyEffectAttackTime5,
+ EHapticsTestModifyEffectAttackTime10,
+ EHapticsTestModifyEffectAttackTime30,
+ EHapticsTestModifyEffectAttackTime60,
+ EHapticsTestModifyEffectFadeTime02,
+ EHapticsTestModifyEffectFadeTime1,
+ EHapticsTestModifyEffectFadeTime5,
+ EHapticsTestModifyEffectFadeTime10,
+ EHapticsTestModifyEffectFadeTime30,
+ EHapticsTestModifyEffectFadeTime60,
+ EHapticsTestModifyEffectPeriod50,
+ EHapticsTestModifyEffectPeriod100,
+ EHapticsTestModifyEffectPeriod300,
+ EHapticsTestModifyEffectPeriod600,
+ EHapticsTestModifyEffectPeriod1000,
+ EHapticsTestModifyEffectPeriod3000,
+ EHapticsTestSynchronousCalls,
+ EHapticsTestAsynchronousCalls,
+ EHapticsTestUsingFileHandle,
+ EHapticsTestNotUsingFileHandle,
+ EHapticsTestShowEffectInfo,
+ EHapticsTestHideEffectInfo,
+ EHapticsTestDeleteIVTData, // for submenu
+ EHapticsTestDeleteIVTDataNoneFound,
+ EHapticsTestDeleteIVTDataSelected,
+ EHapticsTestDeleteAllIVTData,
+ EHapticsTestReserve,
+ EHapticsTestReserveNotTrusted,
+ EHapticsTestReserveTrusted,
+ EHapticsTestReserveNotTrustedTemp,
+ EHapticsTestRelease,
+ EHapticsTestReleaseTemp,
+ EHapticsTestCloseHaptics,
+ EHapticsTestClearOutput,
+ EHapticsTestConstGetters,
+ EHapticsTestGetStatus,
+
+ EHapticsTestPropertiesSubmenu,
+ EHapticsTestCapabilitiesSubmenu,
+
+ EHapticsTestSetPropertyPriorityMin,
+ EHapticsTestSetPropertyPriorityDefault,
+ EHapticsTestSetPropertyPriorityMax,
+ EHapticsTestSetPropertyDisableEffectsTrue,
+ EHapticsTestSetPropertyDisableEffectsFalse,
+ EHapticsTestSetPropertyStrengthMute,
+ EHapticsTestSetPropertyStrengthHalf,
+ EHapticsTestSetPropertyStrengthFull,
+
+
+ EHapticsTestGetPropertyPriority,
+ EHapticsTestGetPropertyDisableEffects,
+ EHapticsTestGetPropertyStrength,
+
+ EHapticsTestGetCapabilityDeviceCategory,
+ EHapticsTestGetCapabilityMaxNestedRepeats,
+ EHapticsTestGetCapabilityNumActuators,
+ EHapticsTestGetCapabilityActuatorType,
+ EHapticsTestGetCapabilityNumEffectSlots,
+ EHapticsTestGetCapabilityNumEffectStyles,
+ EHapticsTestGetCapabilityMinPeriod,
+ EHapticsTestGetCapabilityMaxPeriod,
+ EHapticsTestGetCapabilityMaxEffectDuration,
+ EHapticsTestGetCapabilitySupportedEffects,
+ EHapticsTestGetCapabilityDeviceName,
+ EHapticsTestGetCapabilityMaxEnvelopeTime,
+ EHapticsTestGetCapabilityAPIVersionNumber,
+ EHapticsTestGetCapabilityMaxIVTSize,
+ EHapticsTestPanic,
+
+ EHapticsTestInit,
+ EHapticsToggle,
+ EHapticsTestStreaming,
+ EHapticsTestPlayStreamSample,
+ EHapticsTestNextStreamSample,
+ EHapticsTestPlayAllSamples,
+ EHapticsTestStopStreaming
+ };
+
+#endif // __hapticstest_HRH__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstest.pan Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Panic code definitions.
+*
+*/
+
+
+#ifndef __HAPTICSTEST_PAN__
+#define __HAPTICSTEST_PAN__
+
+/** hapticstest application panic codes */
+enum THapticsTestPanics
+ {
+ EHapticsTestBasicUi = 1
+ // add further panics here
+ };
+
+inline void Panic(THapticsTestPanics aReason)
+ {
+ _LIT(applicationName,"hapticstest");
+ User::Panic(applicationName, aReason);
+ }
+
+#endif // __HAPTICSTEST_PAN__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstestapplication.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Application class definition.
+*
+*/
+
+
+#ifndef __HAPTICSTEST_APPLICATION_H__
+#define __HAPTICSTEST_APPLICATION_H__
+
+#include <aknapp.h>
+
+/**
+ * An instance of CHapticsTestApplication is the application part of the AVKON
+ * application framework for the hapticstest example application
+ */
+class CHapticsTestApplication : public CAknApplication
+ {
+public: // from CAknApplication
+
+ /**
+ *
+ * Returns the application DLL UID value
+ * @return the UID of this Application/Dll
+ */
+ TUid AppDllUid() const;
+
+protected: // from CAknApplication
+
+ /**
+ * Create a CApaDocument object and return a pointer to it
+ * @return a pointer to the created document
+ */
+ CApaDocument* CreateDocumentL();
+ };
+
+#endif // __HAPTICSTEST_APPLICATION_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstestappui.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,619 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: AppUi class definition.
+*
+*/
+
+
+#ifndef __HAPTICSTEST_APPUI_H__
+#define __HAPTICSTEST_APPUI_H__
+
+#include <aknappui.h>
+#include <hwrmhaptics.h>
+#include <hwrmlogicalactuators.h>
+#include "hapticstestasyncplaysender.h"
+
+// Forward reference
+class CHapticsTestAppView;
+class CHWRMHaptics;
+class CHapticsTestEffectDataHandler;
+class CHapticsTestAsyncPlaySender;
+
+/**
+ * @class CHapticsTestAppUi
+ *
+ * An instance of class ChapticstestAppUi is the UserInterface part of the AVKON
+ * application framework for the hapticstest example application
+ */
+class CHapticsTestAppUi : public CAknAppUi,
+ public MHWRMHapticsObserver,
+ public MHWRMHapticsActuatorObserver
+ {
+public:
+
+ /**
+ * Perform the second phase construction of a ChapticstestAppUi object
+ * this needs to be public due to the way the framework constructs the AppUi
+ */
+ void ConstructL();
+
+ /**
+ * Perform the first phase of two phase construction.
+ * This needs to be public due to the way the framework constructs the AppUi
+ */
+ CHapticsTestAppUi();
+
+ /**
+ * Destroy the object and release all memory objects
+ */
+ ~CHapticsTestAppUi();
+
+public: // from CAknAppUi
+
+ /**
+ * Handle user menu selections
+ *
+ * @param aCommand the enumerated code for the option selected
+ */
+ void HandleCommandL(TInt aCommand);
+
+ void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination);
+
+public: // from MEikMenuObserver
+
+ /**
+ * @see MEikMenuObserver
+ *
+ * Manages the options menu contents based on user actions and data.
+ */
+ virtual void DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane );
+
+public: // from MHWRMHapticsObserver
+
+ /**
+ * @see MHWRMHapticsObserver
+ *
+ * Outputs received status values onto the screen.
+ */
+ virtual void HapticsStatusChangedL( THWRMHapticsStatus aStatus );
+
+ /**
+ * @see MHWRMHapticsObserver
+ *
+ * Future use --> empty implementation.
+ */
+ virtual void EffectCompletedL( TInt aError, TInt aEffectHandle );
+
+public:
+
+ /**
+ * @see MHWRMHapticsActuatorObserver
+ *
+ * Outputs received actuator events onto the screen.
+ */
+ virtual void ActuatorEventL( THWRMActuatorEvents aEvent,
+ THWRMLogicalActuators aActuator );
+
+private:
+
+ /**
+ * Creates haptics client instance.
+ */
+ void OpenHapticsL();
+
+ /**
+ * Deletes haptics client instance, and resets member variables
+ * so that options-menu is updated accordingly; i.e. actions, which
+ * require usage of haptics client become hidden.
+ */
+ void CloseHaptics();
+
+ /**
+ * Fetches the supported actuators from haptics server, and stores
+ * the mask to iSupportedActuators.
+ */
+ void FetchSupportedActuators();
+
+ /**
+ * Prints the supported actuators to the UI according to
+ * the value in iSupportedActuators.
+ */
+ void PrintSupportedActuators();
+
+ /**
+ * Attemps to open the given actuator. Prints the result
+ * of the attemp to the UI.
+ *
+ * @param aActuator The logical actuator type to open.
+ */
+ void OpenActuator( THWRMLogicalActuators aActuator );
+
+ /**
+ * Reserves haptics for this application.
+ *
+ * @param aHaptics Haptics client instance, which should be used to
+ * make the reservation.
+ * @param aForceNoCoe If true, forces for haptics not to do automatic
+ * reserve/release on focus gain/lost (in this case this application
+ * must be trusted, otherwise the reservation call will end to
+ * KErrAccessDenied). If false, haptics will use automatic reserve/release
+ * on focus gain/lost (default).
+ */
+ void ReserveHaptics( CHWRMHaptics* aHaptics, TBool aForceNoCoe );
+
+ /**
+ * Searches for IVT-files in the filesystem, and writes
+ * them to iIVTFileArray.
+ */
+ void FindIVTFiles();
+
+ /**
+ * Loads IVT data from the given file to haptics.
+ *
+ * @param aFile File where the IVT-data is stored.
+ */
+ void LoadIVTDataL( TFileName& aFile );
+
+ /**
+ * Plays the effect of the given index in the currently
+ * loaded IVT-file using its filehandle or IVT-data.
+ *
+ * @param aIndex Index of the effect in the IVT-file.
+ */
+ void PlayEffect( TInt aIndex );
+
+ /**
+ * Plays the effect of the given index in the currently
+ * loaded IVT-file repeatedly using its filehandle or IVT-data.
+ *
+ * @param aIndex Index of the effect in the IVT-file.
+ * @param aRepeat Number of times the effect is to be repeated.
+ */
+ void RepeatEffect( TInt aIndex, TInt aRepeats );
+
+ /**
+ * Plays a magsweep effect using manual definition.
+ *
+ * @param aInfinite Whether or not the effect should last infinitely.
+ * @param aModifiable Whether or not the effect should stored to member
+ * variables as the current modifiable effect.
+ */
+ void PlayMagSweepL( TBool aInfinite = EFalse, TBool aModifiable = EFalse );
+
+ /**
+ * Plays a periodic effect using manual definition.
+ *
+ * @param aInfinite Whether or not the effect should last infinitely.
+ * @param aModifiable Whether or not the effect should stored to member
+ * variables as the current modifiable effect.
+ */
+ void PlayPeriodicL( TBool aInfinite = EFalse, TBool aModifiable = EFalse );
+
+ /**
+ * Repeats a timeline effect using manual definition.
+ *
+ * @param aRepeat Number of times the effect is to be repeated.
+ */
+ void PlayRepeatL( TInt aRepeat );
+
+ /**
+ * Pauses the effect of the given index in the effect history data.
+ *
+ * @param aIndex Index of the effect in the effect history data.
+ */
+ void PauseEffect( TInt aIndex );
+
+ /**
+ * Resumes the effect of the given index in the effect history data.
+ *
+ * @param aIndex Index of the effect in the effect history data.
+ */
+ void ResumeEffect( TInt aIndex );
+
+ /**
+ * Stops the effect of the given index in the effect history data.
+ *
+ * @param aIndex Index of the effect in the effect history data.
+ */
+ void StopEffect( TInt aIndex );
+
+ /**
+ * Deletes loaded IVT data.
+ *
+ * @param aIndex Array index to the loaded IVT file array item
+ * (defined below) that is to be deleted.
+ */
+ void DeleteLoadedIVTData( TInt aIndex );
+
+ /**
+ * Deletes all loaded IVT datas.
+ */
+ void DeleteAllLoadedIVTData();
+
+ /**
+ * Fetches the current state of the last played effect
+ * (iEffectHandle), and prints the result to the UI.
+ */
+ void GetCurrentEffectState();
+
+ /**
+ * Prints the status of a "play effect".
+ *
+ * @param aErrorCode Return code from playing an effect.
+ */
+ void PrintPlayEffectStatus( TInt aErrorCode ) const;
+
+ /**
+ * Gets the number of repeats from user in case of
+ * "play effect repeatedly" cases.
+ * In practice opens a list query where user may choose
+ * one of the available repeats values.
+ *
+ * @returns Number of repeats (one of 0,1,2,3,7,255),
+ * where 255 represents infinite value in vibra player.
+ */
+ TInt GetNumberOfRepeats();
+
+ /**
+ * Creates all submenu items for a play effect submenu.
+ * Fetches all the names of the effects from currently
+ * loaded IVT-data.
+ *
+ * @param aMenuPane Menu object to which menu items are added.
+ * @param aCommandId Id of an options menu command to be used
+ * for all items.
+ * @param aDimCommand Id of a command, which needs to be dimmed,
+ * when the submenu contains items.
+ */
+ void CreatePlayEffectSubmenuL( CEikMenuPane* aMenuPane,
+ TInt aCommandId,
+ TInt aDimCommandId );
+
+ /**
+ * Counts the actual effect index (within an IVT file) based
+ * on the index of the selected item in effects submenu.
+ * Also sets the iIVTFileHandle and iIVTDataBuffer members
+ * based on the file containing the selected effect.
+ *
+ * @param aSubmenuIndex Index from the submenu that contains
+ * all currently loaded effects (i.e.,
+ * that contains all effects in all
+ * currently loaded IVT files).
+ *
+ * @returns Effect index.
+ */
+ TInt CountFileHandleAndEffectIndex( TInt aSubmenuIndex );
+
+ /**
+ * Prints effect information got from getter functions.
+ *
+ * @param aIndex Index of the effect in the IVT-file.
+ */
+ void PrintEffectInfo( TInt aIndex );
+
+ /**
+ * Prints the given status onto the screen.
+ *
+ * @param aStatus Status value to be printed.
+ */
+ void PrintStatusInfo( MHWRMHapticsObserver::THWRMHapticsStatus aStatus ) const;
+
+ /**
+ * Runs test for all getter methods for constants
+ * and prints out the results.
+ */
+ void ConstGetters() const;
+
+ /**
+ * Modifies an effect using the values set for iModifyEffect.
+ */
+ void ModifyEffect();
+
+ /**
+ * Sets property Priority to min
+ */
+ void SetPropertyPriorityMin();
+
+ /**
+ * Sets property Priority to default
+ */
+ void SetPropertyPriorityDefault();
+
+ /**
+ * Sets property Priority to max
+ */
+ void SetPropertyPriorityMax();
+
+ /**
+ * Sets property Disable effects to ETrue
+ */
+ void SetPropertyDisableEffectsTrue();
+
+ /**
+ * Sets property Disable effects to EFalse
+ */
+ void SetPropertyDisableEffectsFalse();
+
+ /**
+ * Sets property Strength to Min level
+ */
+ void SetPropertyStrengthMin();
+
+ /**
+ * Sets property Strength to middle level
+ */
+ void SetPropertyStrengthMiddle();
+
+ /**
+ * Sets property Strength to Max level
+ */
+ void SetPropertyStrengthMax();
+
+ /**
+ * Gets Priority property value
+ */
+ void GetPropertyPriority();
+
+ /**
+ * Gets Disable Effects property value
+ */
+ void GetPropertyDisableEffects();
+
+ /**
+ * Gets Strength property value
+ */
+ void GetPropertyStrength();
+
+ /**
+ * Gets device category capability.
+ */
+ void GetCapabilityDeviceCategory();
+
+ /**
+ * Gets max nested repeats..
+ */
+ void GetCapabilityMaxNestedRepeats();
+
+ /**
+ * Gets number of actuators capability.
+ */
+ void GetCapabilityNumActuators();
+
+ /**
+ * Gets actuator type capability.
+ */
+ void GetCapabilityActuatorType();
+
+ /**
+ * Gets number of effect slots.
+ */
+ void GetCapabilityNumEffectSlots();
+
+ /**
+ * Gets number of effect styles.
+ */
+ void GetCapabilityNumEffectStyles();
+
+ /**
+ * Gets minimum period of periodic effects.
+ */
+ void GetCapabilityMinPeriod();
+
+ /**
+ * Gets maximum period of periodic effects.
+ */
+ void GetCapabilityMaxPeriod();
+
+ /**
+ * Gets maximum effect duration..
+ */
+ void GetCapabilityMaxEffectDuration();
+
+ /**
+ * Gets supported effect types..
+ */
+ void GetCapabilitySupportedEffects();
+
+ /**
+ * Gets device name capability.
+ */
+ void GetCapabilityDeviceName();
+
+ /**
+ * Gets max envelope type.
+ */
+ void GetCapabilityMaxEnvelopeTime();
+
+ /**
+ * Gets API version number.
+ */
+ void GetCapabilityAPIVersionNumber();
+
+ /**
+ * Gets max size of IVT file.
+ */
+ void GetCapabilityMaxIVTSize();
+
+ /**
+ * Callback method for CPeriodic timer for modifying a certain effect
+ * after each time period.
+ *
+ * @param aPtr Pointer to a TModifyEffect data used for the modification.
+ * @return System wide error code.
+ */
+ static TInt ModifyPlayingEffect( TAny* aPtr );
+
+ /**
+ * Enables streaming mode.
+ */
+ void StartStreaming();
+
+ /**
+ * Plays one streaming sample from KStreamArray.
+ *
+ * @param aSampleId Index to KStreamArray.
+ */
+ void PlayStreamingSample( TInt aSampleId );
+
+ /**
+ * Disables streaming mode.
+ */
+ void StopStreaming();
+
+private:
+
+ /**
+ * Internal struct for IVT files that contain file name,
+ * file handle (received from haptics) and IVT data
+ * as data buffer.
+ */
+ struct TLoadedIVTFileItem
+ {
+ TFileName iFileName;
+ TInt iFileHandle;
+ HBufC8* iDataBuffer; // owns
+
+ // ctor
+ TLoadedIVTFileItem() : iFileHandle( 0 ), iDataBuffer ( NULL )
+ {
+ // empty
+ }
+
+ // static matcher method used in checking whether the
+ // given file (name) is already in the loaded IVT
+ // files storage.
+ static TBool Match( const TLoadedIVTFileItem& a, const TLoadedIVTFileItem& b )
+ {
+ TBool retVal = EFalse;
+ if ( 0 == a.iFileName.CompareF( b.iFileName ) )
+ {
+ retVal = ETrue;
+ }
+ return retVal;
+ }
+ };
+
+private:
+
+ /**
+ * Menu pane pointer received in DynInitMenuPaneL() used
+ * in handling dynamic submenus (in HandleCommandL()).
+ * Not owned.
+ */
+ CEikMenuPane* iMenuPane;
+
+ /**
+ * Application view instance. Owned.
+ */
+ CHapticsTestAppView* iAppView;
+
+ /**
+ * Haptics client instance. Owned.
+ */
+ CHWRMHaptics* iHaptics;
+
+ /**
+ * Second haptics client instance used for making reservations,
+ * which cause iHaptics unable to use play-commands. Owned.
+ */
+ CHWRMHaptics* iTempHaptics;
+
+ /**
+ * Holds the information which logical actuators are supported
+ * by the haptics system. In the options menu, this value is used
+ * in construction of the actuator opening submenu.
+ */
+ TUint32 iSupportedActuators;
+
+ /**
+ * Constains the names of the IVT-files found in the
+ * filesystem, when the application was launched.
+ */
+ RArray<TFileName> iIVTFileArray;
+
+ /**
+ * Array that contains above defined items that represent
+ * currently loaded IVT files.
+ */
+ RArray<TLoadedIVTFileItem> iLoadedIVTFileArray;
+
+ /**
+ * Whether or not an actuator has been successfully opened.
+ */
+ TBool iActuatorOpened;
+
+ /**
+ * Filehandle to loaded IVT-data.
+ */
+ TInt iIVTFileHandle;
+
+ /**
+ * Buffer containing latest loaded IVT-data.
+ */
+ HBufC8* iIVTDataBuffer; // not owned
+
+ /**
+ * Effect handle to the last played effect.
+ */
+ TInt iEffectHandle;
+
+ /**
+ * Whether or not to use synchronous calls to haptics by defualt.
+ */
+ TBool iSynchronous;
+
+ /**
+ * Whether or not to use fileHandle when calling "play" Haptics API
+ * methods.
+ */
+ TBool iUseHandle;
+
+ /**
+ * Whether or not files are read from mem card (if not, they're
+ * read from phone memory).
+ */
+ TBool iUsesMemCard;
+
+ /**
+ * Is effect information showed or not
+ */
+ TBool iShowEffectInfo;
+
+ /**
+ * Objects used for storaging effect related history data and
+ * modifiable effect data.
+ */
+ CHapticsTestEffectDataHandler* iEffectData;
+
+ /**
+ * Is effect streaming on or not
+ */
+ TBool iStreaming;
+
+ /**
+ * played stream sample number
+ */
+ TInt iCurrentSample;
+
+ /**
+ * Active object for sending async play commands
+ */
+ CHapticsTestAsyncPlaySender* iAsyncPlaySender;
+ friend class CHapticsTestAsyncPlaySender;
+ };
+
+
+#endif // __HAPTICSTEST_APPUI_H__
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstestappview.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,110 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: AppView class definition.
+*
+*/
+
+
+#ifndef __HAPTICSTEST_APPVIEW_H__
+#define __HAPTICSTEST_APPVIEW_H__
+
+#include <coecntrl.h>
+
+class CRichText;
+class CParaFormatLayer;
+class CCharFormatLayer;
+class CEikRichTextEditor;
+
+/**
+ * An instance of the Application View object for the hapticstest
+ * example application
+ */
+class CHapticsTestAppView : public CCoeControl
+ {
+public:
+
+ /**
+ * Create a ChapticstestAppView object, which will draw itself to aRect
+ *
+ * @param aRect the rectangle this view will be drawn to
+ * @return a pointer to the created instance of ChapticstestAppView
+ */
+ static CHapticsTestAppView* NewL( const TRect& aRect );
+
+ /**
+ * Create a ChapticstestAppView object, which will draw itself to aRect
+ *
+ * @param aRect the rectangle this view will be drawn to
+ * @return a pointer to the created instance of ChapticstestAppView
+ */
+ static CHapticsTestAppView* NewLC( const TRect& aRect );
+
+ /**
+ * Destroy the object and release all memory objects
+ */
+ ~CHapticsTestAppView();
+
+ /**
+ * Output the given line of text to the user.
+ *
+ * @param aOutputLine Text to be added to the end of the output.
+ * @param aLineBreak Whether or not to add line break to the end
+ * of the print. By default the break is inserted.
+ */
+ void InsertOutput( const TDesC& aOutputLine,
+ TBool aLineBreak = ETrue ) const;
+
+ /**
+ * Clears the output view.
+ */
+ void ClearOutput() const;
+
+public: // from CCoeControl
+
+ /**
+ * Draw this ChapticstestAppView to the screen
+ *
+ * @param aRect the rectangle of this view that needs updating
+ */
+ void Draw(const TRect& aRect) const;
+
+ /**
+ * @see CCoeControl
+ */
+ virtual void SizeChanged();
+
+private:
+
+ /**
+ * Perform the second phase construction of a ChapticstestAppView object
+ *
+ * @param aRect the rectangle this view will be drawn to
+ */
+ void ConstructL(const TRect& aRect);
+
+ /**
+ * Perform the first phase of two phase construction
+ */
+ CHapticsTestAppView();
+
+private:
+
+ CParaFormatLayer* iParaFormat;
+ CCharFormatLayer* iCharFormat;
+ CRichText* iRichText;
+ CEikRichTextEditor* iOutputWindow;
+ };
+
+
+#endif // __HAPTICSTEST_APPVIEW_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstestasyncplaysender.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Definition for asynchronous play commands sender object.
+*
+*/
+
+
+#ifndef __HAPTICSTEST_ASYNCPLAYSENDER_H__
+#define __HAPTICSTEST_ASYNCPLAYSENDER_H__
+
+#include <e32base.h>
+class CHapticsTestAppView;
+class CHapticsTestAppUi;
+
+/**
+ * Active Object for sending async play methods
+ */
+class CHapticsTestAsyncPlaySender : public CActive
+ {
+public:
+
+ /**
+ * Constructor
+ *
+ * @param aUi Pointer to the test appl UI object.
+ */
+ CHapticsTestAsyncPlaySender( CHapticsTestAppUi* aUi );
+
+ /**
+ * Destructor
+ */
+ virtual ~CHapticsTestAsyncPlaySender();
+
+ /**
+ * Method for fileHandle type playing of effects repeatedly in asynch mode
+ *
+ * @param aHaptics Pointer to the haptics interface object.
+ * @param aFileHandle Handle for the effect data buffer from which to
+ * play the effects.
+ * @param aEffectIndex Index of the effect that is being played.
+ * @param aRepeat Number of repeats.
+ * @param aEffectHandle Out-parameter to which the handle for the played
+ * effect is returned.
+ */
+ void PlayRepeat( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TUint8 aRepeat,
+ TInt& aEffectHandle );
+
+ /**
+ * Method for fileHandle type playing of effects in asynch mode
+ *
+ * @param aHaptics Pointer to the haptics interface object.
+ * @param aFileHandle Handle for the effect data buffer from which to
+ * play the effects.
+ * @param aEffectIndex Index of the effect that is being played.
+ * @param aEffectHandle Out-parameter to which the handle for the played
+ * effect is returned.
+ */
+ void Play( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TInt& aEffectHandle );
+
+public:
+
+ /**
+ * From CActive
+ */
+ virtual void RunL();
+
+ /**
+ * From CActive
+ */
+ virtual void DoCancel();
+
+ /**
+ * From CActive
+ */
+ virtual TInt RunError( TInt aError );
+
+private:
+
+ /**
+ * Pointer to the application UI object.
+ * Not owned.
+ */
+ CHapticsTestAppUi* iUi;
+
+ /**
+ * Index of the effect for which the play request was made.
+ */
+ TInt iIndex;
+ };
+
+#endif // __HAPTICSTEST_ASYNCPLAYSENDER_H__
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstestdocument.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,86 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Document class definition.
+*
+*/
+
+
+#ifndef __HAPTICSTEST_DOCUMENT_H__
+#define __HAPTICSTEST_DOCUMENT_H__
+
+#include <akndoc.h>
+
+// Forward references
+class CHapticsTestAppUi;
+class CEikApplication;
+
+
+/**
+ * An instance of class ChapticstestDocument is the Document part of the AVKON
+ * application framework for the hapticstest example application
+ */
+class CHapticsTestDocument : public CAknDocument
+ {
+public:
+
+ /**
+ * Construct a ChapticstestDocument for the AVKON application aApp
+ * using two phase construction, and return a pointer to the created object
+ *
+ * @param aApp application creating this document
+ * @return a pointer to the created instance of ChapticstestDocument
+ */
+ static CHapticsTestDocument* NewL(CEikApplication& aApp);
+
+ /**
+ * Construct a ChapticstestDocument for the AVKON application aApp
+ * using two phase construction, and return a pointer to the created object
+ *
+ * @param aApp application creating this document
+ * @return a pointer to the created instance of ChapticstestDocument
+ */
+ static CHapticsTestDocument* NewLC(CEikApplication& aApp);
+
+ /**
+ * Destroy the object and release all memory objects
+ */
+ ~CHapticsTestDocument();
+
+public: // from CAknDocument
+
+ /**
+ * Create a ChapticstestAppUi object and return a pointer to it
+ *
+ * @return a pointer to the created instance of the AppUi created
+ */
+ CEikAppUi* CreateAppUiL();
+
+private:
+
+ /**
+ * Perform the second phase construction of a ChapticstestDocument object
+ */
+ void ConstructL();
+
+ /**
+ * Perform the first phase of two phase construction
+ *
+ * @param application creating this document
+ */
+ CHapticsTestDocument(CEikApplication& aApp);
+
+ };
+
+
+#endif // __HAPTICSTEST_DOCUMENT_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/inc/hapticstesteffectdatahandler.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,486 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Handles and stores effect related data.
+*
+*/
+
+
+#ifndef __HAPTICSTEST_EFFECTDATAHANDLER_H__
+#define __HAPTICSTEST_EFFECTDATAHANDLER_H__
+
+#include <e32base.h>
+#include <hwrmhaptics.h>
+
+// values used for modifying effects
+const TInt KEffectMagnitude25 = 0.25 * KHWRMHapticsMaxMagnitude;
+const TInt KEffectMagnitude50 = 0.50 * KHWRMHapticsMaxMagnitude;
+const TInt KEffectMagnitude75 = 0.75 * KHWRMHapticsMaxMagnitude;
+const TInt KEffectDuration1 = 1000;
+const TInt KEffectDuration5 = 5000;
+const TInt KEffectDuration10 = 10000;
+const TInt KEffectDuration30 = 30000;
+const TInt KEffectDuration60 = 60000;
+const TInt KEffectAttackTime02 = 200;
+const TInt KEffectAttackTime1 = 1000;
+const TInt KEffectAttackTime5 = 5000;
+const TInt KEffectAttackTime10 = 10000;
+const TInt KEffectAttackTime30 = 30000;
+const TInt KEffectAttackTime60 = 60000;
+const TInt KEffectFadeTime02 = 200;
+const TInt KEffectFadeTime1 = 1000;
+const TInt KEffectFadeTime5 = 5000;
+const TInt KEffectFadeTime10 = 10000;
+const TInt KEffectFadeTime30 = 30000;
+const TInt KEffectFadeTime60 = 60000;
+const TInt KEffectPeriod50 = 50;
+const TInt KEffectPeriod100 = 100;
+const TInt KEffectPeriod300 = 300;
+const TInt KEffectPeriod600 = 600;
+const TInt KEffectPeriod1000 = 1000;
+const TInt KEffectPeriod3000 = 3000;
+
+/**
+ * Handles effect data storage of both history data of
+ * played effects (array) and single effect data of the
+ * effect, which can be modified during runtime.
+ */
+class CHapticsTestEffectDataHandler : public CBase
+ {
+public:
+
+ /**
+ * Symbian two-phased construction.
+ *
+ * @return Pointer to the created instance.
+ */
+ static CHapticsTestEffectDataHandler* NewL();
+
+ /**
+ * Symbian two-phased construction. Leaves the pointer
+ * onto the cleanupstack.
+ *
+ * @return Pointer to the created instance.
+ */
+ static CHapticsTestEffectDataHandler* NewLC();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CHapticsTestEffectDataHandler();
+
+public: // effect history array related
+
+ /**
+ * Adds effect data to effect history array.
+ *
+ * @param aEffectHandle Handle to the effect just played.
+ * @param aFileHandle Handle to IVT-file used for the effect. The
+ * default value KErrNotFound indicates that an IVT-file was not used.
+ * @param aIndex Index of the effect in the effect file. The default
+ * value KErrNotFound indicates that an IVT-file was not used.
+ */
+ void AddEffectInfo( TInt aEffectHandle,
+ TInt aFileHandle = KErrNotFound,
+ TInt aIndex = KErrNotFound );
+
+ /**
+ * Deletest all effect info items from the list that have the
+ * given filehandle in their data. This method is used, when deleting
+ * IVT-data, i.e. that data is no longer available.
+ *
+ * @param aFileHandle Handle to IVT-file used for the effect.
+ */
+ void DeleteEffectInfo( TInt aFileHandle );
+
+ /**
+ * Returns the amount of effect data stored in the history data array.
+ */
+ TInt Count() const;
+
+ /**
+ * Returns the effect handle of the given effect data item.
+ *
+ * @param aIndex Index of the effect data in the history array.
+ * @return The effect handle of the effect.
+ */
+ TInt EffectHandle( TInt aIndex ) const;
+
+ /**
+ * Returns the file handle of the given effect data item.
+ *
+ * @param aIndex Index of the effect data in the history array.
+ * @return The file handle of the effect.
+ */
+ TInt FileHandle( TInt aIndex ) const;
+
+ /**
+ * Returns the effect index of the given effect data item.
+ *
+ * @param aIndex Index of the effect data in the history array.
+ * @return The effect index of the effect.
+ */
+ TInt EffectIndex( TInt aIndex ) const;
+
+public: // modifiable effect related
+
+ /**
+ * Resets the modifiable effect data with the data received in the
+ * given magsweep effect.
+ *
+ * @param aMagSweep MagSweep effect data.
+ * @param aEffectHandle Effect handle to this effect.
+ * @param aHaptics Haptics client instance.
+ */
+ void ResetModifiableMagSweepEffectL( const CHWRMHaptics::THWRMHapticsMagSweepEffect& aMagSweep,
+ TInt aEffectHandle,
+ CHWRMHaptics* aHaptics );
+
+ /**
+ * Resets the modifiable effect data with the data received in the
+ * given periodic effect.
+ *
+ * @param aPeriodic Periodic effect data.
+ * @param aEffectHandle Effect handle to this effect.
+ * @param aHaptics Haptics client instance.
+ */
+ void ResetModifiablePeriodicEffectL( const CHWRMHaptics::THWRMHapticsPeriodicEffect& aPeriodic,
+ TInt aEffectHandle,
+ CHWRMHaptics* aHaptics );
+
+ /**
+ * Starts the timer, which calls the ModifyPlayingEffect() callback
+ * after a certain time period for modifying the last stored effect
+ * using ResetModifiableEffectL().
+ *
+ * @param aFunction Callback method for the started timer.
+ */
+ void StartModifiableEffectTimerL( TInt (*aFunction)(TAny* aPtr) );
+
+ /**
+ * Stops and deletes the auto-modifiable effect timer.
+ */
+ void ResetModifiableEffectTimer();
+
+ /**
+ * Returns whether or not a modifiable effect exists.
+ */
+ TBool ModifiableEffectExists() const;
+
+ /**
+ * Returns whether or not the currently stored effect is a
+ * magsweep effect.
+ */
+ TBool ModifiableEffectIsMagSweep() const;
+
+ /**
+ * Returns whether or not the currently stored effect is a
+ * periodic effect.
+ */
+ TBool ModifiableEffectIsPeriodic() const;
+
+ /**
+ * Returns the effect handle of the modifiable effect.
+ */
+ TInt ModifiableEffectHandle() const;
+
+ /**
+ * Returns the amount of times the current modifiable effect
+ * has been modified already.
+ */
+ TInt ModifyCount() const;
+
+ /**
+ * Returns the pointer to the haptics client instance, which
+ * has been set to the effect modification data.
+ */
+ CHWRMHaptics* Haptics() const;
+
+ /**
+ * Fills in default magsweep effect data into the given structure.
+ *
+ * @param aMagSweep MagSweep effect data structure for the method to fill.
+ * @param aInfinite Whether or not the duration should be infinite.
+ * @param aAutoModifiable Whether or not the created data is used
+ * for automatic modification using a timer.
+ * @param aHaptics Haptics client instance.
+ */
+ void FillDefaultMagSweepData( CHWRMHaptics::THWRMHapticsMagSweepEffect& aMagSweep,
+ TBool aInfinite, TBool aAutoModifiable,
+ CHWRMHaptics* aHaptics ) const;
+
+ /**
+ * Fills in default periodic effect data into the given structure.
+ *
+ * @param aPeriodic Periodic effect data structure for the method to fill.
+ * @param aInfinite Whether or not the duration should be infinite.
+ * @param aAutoModifiable Whether or not the created data is used
+ * for automatic modification using a timer.
+ * @param aHaptics Haptics client instance.
+ */
+ void FillDefaultPeriodicData( CHWRMHaptics::THWRMHapticsPeriodicEffect& aPeriodic,
+ TBool aInfinite, TBool aAutoModifiable,
+ CHWRMHaptics* aHaptics ) const;
+
+ /**
+ * Fills in the modifiable effect data into the given magsweep structure.
+ *
+ * @param aMagSweep MagSweep effect data structure for the method to fill.
+ */
+ void FillModifiableMagSweepData( CHWRMHaptics::THWRMHapticsMagSweepEffect& aMagSweep ) const;
+
+ /**
+ * Fills in the modifiable effect data into the given periodic structure.
+ *
+ * @param aPeriodic Periodic effect data structure for the method to fill.
+ */
+ void FillModifiablePeriodicData( CHWRMHaptics::THWRMHapticsPeriodicEffect& aPeriodic ) const;
+
+ /**
+ * Sets the modifiable effect's modify count.
+ */
+ void SetModifyCount( TInt aModifyCount );
+
+ /**
+ * Sets the modifiable effect's duration value.
+ */
+ void SetDuration( TInt aDuration );
+
+ /**
+ * Sets the modifiable effect's magnitude value.
+ */
+ void SetMagnitude( TInt aMagnitude );
+
+ /**
+ * Sets the modifiable effect's style value.
+ */
+ void SetStyle( CHWRMHaptics::THWRMHapticsEffectStyles aStyle );
+
+ /**
+ * Sets the modifiable effect's attack level value.
+ */
+ void SetAttackLevel( TInt aAttackLevel );
+
+ /**
+ * Sets the modifiable effect's fade level value.
+ */
+ void SetFadeLevel( TInt aFadeLevel );
+
+ /**
+ * Sets the modifiable effect's attack time value.
+ */
+ void SetAttackTime( TInt aAttackTime );
+
+ /**
+ * Sets the modifiable effect's fade time value.
+ */
+ void SetFadeTime( TInt aFadeTime );
+
+ /**
+ * Sets the modifiable effect's period value.
+ */
+ void SetPeriod( TInt aPeriod );
+
+public: // submenu handling for effect data related submenus
+
+ /**
+ * Creates all submenu items for a change effect state submenu
+ * (pause, resume, stop). Fetches all the names of the effects
+ * from currently loaded IVT-data.
+ *
+ * @param aMenuPane Menu object to which menu items are added.
+ * @param aCommandId Id of an options menu command to be used
+ * for all items.
+ * @param aHaptics Haptics client instance used for fetching effect names.
+ */
+ void DynInitChangeEffectStateSubmenuL( CEikMenuPane* aMenuPane,
+ TInt aCommandId,
+ CHWRMHaptics* aHaptics );
+
+ /**
+ * Creates the checkmark to the duration, which is currently in use
+ * in the duration modification submenu.
+ */
+ void DynInitDurationSubmenu( CEikMenuPane* aMenuPane ) const;
+
+ /**
+ * Creates the checkmark to the magnitude, which is currently in use
+ * in the magnitude modification submenu.
+ */
+ void DynInitMagnitudeSubmenu( CEikMenuPane* aMenuPane ) const;
+
+ /**
+ * Creates the checkmark to the style, which is currently in use
+ * in the style modification submenu.
+ */
+ void DynInitStyleSubmenu( CEikMenuPane* aMenuPane ) const;
+
+ /**
+ * Creates the checkmark to the attack level, which is currently in use
+ * in the attack level modification submenu.
+ */
+ void DynInitAttackLevelSubmenu( CEikMenuPane* aMenuPane ) const;
+
+ /**
+ * Creates the checkmark to the fade level, which is currently in use
+ * in the fade level modification submenu.
+ */
+ void DynInitFadeLevelSubmenu( CEikMenuPane* aMenuPane ) const;
+
+ /**
+ * Creates the checkmark to the attack time, which is currently in use
+ * in the attack time modification submenu.
+ */
+ void DynInitAttackTimeSubmenu( CEikMenuPane* aMenuPane ) const;
+
+ /**
+ * Creates the checkmark to the fade time, which is currently in use
+ * in the fade time modification submenu.
+ */
+ void DynInitFadeTimeSubmenu( CEikMenuPane* aMenuPane ) const;
+
+ /**
+ * Creates the checkmark to the period, which is currently in use
+ * in the period modification submenu.
+ */
+ void DynInitPeriodSubmenu( CEikMenuPane* aMenuPane ) const;
+
+private:
+
+ /**
+ * Internal structure for maintaining information about played
+ * effect. The data is used, when pausing, stopping and resuming
+ * effect play.
+ */
+ struct TPlayedEffect
+ {
+ /**
+ * Handle to IVT-data file, from which the effect has been played.
+ * Needed for fetching effect related information.
+ */
+ TInt iFileHandle;
+
+ /**
+ * Index of the effect in the effect file. Needed for fetching
+ * effect related information.
+ */
+ TInt iEffectIndex;
+
+ /**
+ * Handle to the effect itself.
+ */
+ TInt iEffectHandle;
+ };
+
+ /**
+ * Internal structure for maintaining information about an effect,
+ * which can be modified during application execution.
+ */
+ struct TModifyEffect
+ {
+ /**
+ * Haptics client instance. Not owned.
+ * The pointer is included in this data so that the
+ * timer callback method is able to access haptics.
+ */
+ CHWRMHaptics* iHaptics;
+
+ /**
+ * Type of the effect being modified.
+ */
+ CHWRMHaptics::THWRMHapticsEffectTypes iEffectType;
+
+ /**
+ * Handle to the effect itself.
+ */
+ TInt iEffectHandle;
+
+ /**
+ * Keeps track on how many modifications have been done.
+ */
+ TInt iModifyCount;
+
+ /**
+ * Duration value used for the effect.
+ */
+ TInt iDuration;
+
+ /**
+ * Magnitude value used for the effect.
+ */
+ TInt iMagnitude;
+
+ /**
+ * Style of the effect.
+ */
+ TInt iStyle;
+
+ /**
+ * Attack level value used for the effect.
+ */
+ TInt iAttackLevel;
+
+ /**
+ * Fade level value used for the effect.
+ */
+ TInt iFadeLevel;
+
+ /**
+ * Attack time value used for the effect.
+ */
+ TInt iAttackTime;
+
+ /**
+ * Fade time value used for the effect.
+ */
+ TInt iFadeTime;
+
+ /**
+ * Period value used for the (periodic) effect.
+ */
+ TInt iPeriod;
+ };
+
+private:
+
+ /**
+ * C++ constructor.
+ */
+ CHapticsTestEffectDataHandler();
+
+ /**
+ * Second phase construction.
+ */
+ void ConstructL();
+
+private:
+
+ /**
+ * Array containing history data of effect play. Used for
+ * pausing, resuming and stopping effects.
+ */
+ RArray<TPlayedEffect> iPlayedEffectArray;
+
+ /**
+ * Timer used for constant modification of an effect.
+ */
+ CPeriodic* iModifyTimer;
+
+ /**
+ * Effect data stored for effect modification.
+ */
+ TModifyEffect* iModifyEffect;
+ };
+
+
+#endif // __HAPTICSTEST_EFFECTDATAHANDLER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/rom/hapticstest.iby Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: IBY file for Haptics client test application
+*
+*/
+
+
+#ifndef __HAPTICSTEST_IBY__
+#define __HAPTICSTEST_IBY__
+
+#include <data_caging_paths_for_iby.hrh>
+
+file=ABI_DIR\BUILD_DIR\hapticstest.exe PROGRAMS_DIR\hapticstest.exe
+data=DATAZ_\APP_RESOURCE_DIR\hapticstest.rsc APP_RESOURCE_DIR\hapticstest.rsc
+data=DATAZ_\private\10003a3f\import\apps\hapticstest_reg.rsc \private\10003a3f\import\apps\hapticstest_reg.rsc
+
+#endif // __HAPTICSTEST_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/sis/createandsign.cmd Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,22 @@
+@echo off
+REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+REM All rights reserved.
+REM This component and the accompanying materials are made available
+REM under the terms of the License "Symbian Foundation License v1.0"
+REM which accompanies this distribution, and is available
+REM at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+REM
+REM Initial Contributors:
+REM Nokia Corporation - initial contribution.
+REM
+REM Contributors:
+REM
+REM Description: ?Description
+REM
+REM
+@echo on
+
+
+del /q hapticstest.sis*
+makesis hapticstest.pkg
+signsis hapticstest.sis hapticstest.sisx rdtest_02.der rdtest_02.key
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/sis/hapticstest.pkg Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,22 @@
+; hapticstest.pkg
+;
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"hapticstest"},(0x0AD0595A),1,0,0
+
+;Supports Series 60 v 3.0
+[0x101F7961],0,0,0,{"Series60ProductID"}
+
+;Localized Vendor Name
+%{"My Test EN"}
+
+;Unique Vendor name
+:"Vendor"
+
+; Files to copy
+"\epoc32\release\armv5\urel\hapticstest.exe"-"!:\sys\bin\hapticstest.exe"
+"\epoc32\data\z\private\10003a3f\import\apps\hapticstest_reg.rsc"-"!:\private\10003a3f\import\apps\hapticstest_reg.rsc"
+"\epoc32\data\z\resource\apps\hapticstest_loc.Rsc"-"!:\resource\apps\hapticstest_loc.Rsc"
+"\epoc32\data\z\resource\apps\hapticstest.Rsc"-"!:\resource\apps\hapticstest.Rsc"
Binary file hwrmhaptics/examples/hapticstestapp/sis/rdtest_02.der has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/sis/rdtest_02.key Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC/TDP7KKIaf5+uW4OD2iVZuUMC2a+SeQTjf6srlKcOm+CpPNXn
+uLNm/8fdEnyOIuRXPRKmqhs1n0JkxEGHynELWMTuKXbQx9SRAGUXzyneGn+IJNnO
+vOKHWgKCouX2hfI8rtkdqJpqmO460gGsMgw+lsbeyWyW9lnfLxq+ZC7sqQIDAQAB
+AoGBALmUWZE8GBaQ3P4u9WUCSd3DJkkrmXIFSULSZeH/chlwCwDjbbhArHothVzo
+REE3hEFFlERvHbplZ+mNouzy7boduvgUzbksGrbGMLJ2qO1GzWWVwV+GzOWKd3ss
+/98Gwoy5R8pjnkqUE2wP1iJFw0FjvUTKcYv/z6t3LLJ0CsoBAkEA+c7ixvsviQ3J
+s0INytCKU2bf8fqFQJi1VI82ukxNsujGTQ9upVSjuvqPvWyDvvTdrUBHqO+3qPut
+sEh01Q8aiQJBAMQKDJPVRu4ud3mwUfEavzL5EjqwG1k9VCNGYsT4FwtrHcxu1oP/
+pk6M3rIZukqomoEEnHWPMwhrK3fhBqi0OSECQQDr40VXege4FnH5OI2Hj4afHMyp
+VdQQXGMWFyopnzXblFz0lXb43cTCIiorR9XcMqNFHybLypkWE5o+lRzlt55pAkBQ
+P/zeF5Sts//cpL0mgdh7OVKpC6ZmZaCnwAx2rUhhuDu+kDDoYCLoTOps5fNI1LRK
+1GRoC3LMo3Jr5IYhUYWBAkBpCpN6k4JU/mszq98EojHerQNxk8sPqvQKUzTutohT
+1gLX9yepGayB/TtT2EEJDkWOlnTy/dvN6W3vzbJYz97x
+-----END RSA PRIVATE KEY-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/src/hapticstest.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,73 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "hapticstestapplication.h"
+#include <eikstart.h>
+
+#ifdef __UI_FRAMEWORKS_V2__
+
+// ---------------------------------------------------------
+// Create an application, and return a pointer to it
+// ---------------------------------------------------------
+//
+CApaApplication* NewApplication()
+ {
+ return new CHapticsTestApplication;
+ }
+
+// ---------------------------------------------------------
+// Main entry-point.
+// ---------------------------------------------------------
+//
+TInt E32Main()
+ {
+ return EikStart::RunApplication(NewApplication);
+ }
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// The following is required for wins on EKA1 (using the exedll target)
+//
+#if defined(__WINS__) && !defined(EKA2)
+EXPORT_C TInt WinsMain(TDesC* aCmdLine)
+ {
+ return EikStart::RunApplication(NewApplication, aCmdLine);
+ }
+
+TInt E32Dll(TDllReason)
+ {
+ return KErrNone;
+ }
+#endif
+
+#else // __UI_FRAMEWORKS_V2__
+
+// Create an application, and return a pointer to it
+EXPORT_C CApaApplication* NewApplication()
+ {
+ return new ChapticstestApplication;
+ }
+
+// DLL entry point, return that everything is ok
+GLDEF_C TInt E32Dll(TDllReason)
+ {
+ return KErrNone;
+ }
+
+#endif // __UI_FRAMEWORKS_V2__
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/src/hapticstestapplication.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Application class implementation.
+*
+*/
+
+
+#include "hapticstestdocument.h"
+#include "hapticstestapplication.h"
+
+// UID for the application, this should correspond to the uid defined in the mmp file
+static const TUid KUidhapticstestApp = {0x0AD0595A};
+
+// ---------------------------------------------------------
+// Creates the document component of the application.
+// ---------------------------------------------------------
+//
+CApaDocument* CHapticsTestApplication::CreateDocumentL()
+ {
+ // Create an hapticstest document, and return a pointer to it
+ CApaDocument* document = CHapticsTestDocument::NewL(*this);
+ return document;
+ }
+
+// ---------------------------------------------------------
+// Returns application uid.
+// ---------------------------------------------------------
+//
+TUid CHapticsTestApplication::AppDllUid() const
+ {
+ // Return the UID for the hapticstest application
+ return KUidhapticstestApp;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/src/hapticstestappui.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,3369 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: AppUi class implementation.
+*
+*/
+
+
+#include <avkon.hrh>
+#include <e32math.h>
+#include <eikmenup.h>
+#include <aknlistquerydialog.h>
+#include <hapticstest.rsg>
+#include <utf.h>
+
+#include "hapticstest.pan"
+#include "hapticstestappui.h"
+#include "hapticstestappview.h"
+#include "hapticstesteffectdatahandler.h"
+#include "hapticstest.hrh"
+
+_LIT( KSessionPathMem, "C:\\Data\\Others\\" );
+_LIT( KSessionPathCrd, "E:\\Others\\" );
+_LIT( KIVTFileType, "*.ivt" );
+
+const TInt KSampleCount = 8;
+
+static const TUint8 KStreamArray[KSampleCount][10] =
+ {
+ 0x00, 0x00, 0x20, 0x13, 0x00, 0x00, 0x7f, 0x01, 0x5d, 0x41,
+ 0x29, 0x00, 0x20, 0x08, 0x00, 0x00, 0x7f, 0xc1, 0x4d, 0x42,
+ 0x51, 0x00, 0x20, 0x08, 0x00, 0x00, 0x7f, 0x01, 0x5d, 0xc1,
+ 0x65, 0x00, 0x20, 0x07, 0x00, 0x00, 0x7f, 0x01, 0x5d, 0xd1,
+ 0x7a, 0x00, 0x20, 0x08, 0x00, 0x00, 0x7f, 0xc1, 0x4d, 0x42,
+ 0x8e, 0x00, 0x20, 0x16, 0x00, 0x00, 0x7f, 0x01, 0x5d, 0x01,
+ 0xa2, 0x00, 0x20, 0x08, 0x00, 0x00, 0x7f, 0xc1, 0x4d, 0x42,
+ 0x06, 0x00, 0x20, 0x08, 0x00, 0x00, 0x7f, 0xc1, 0x4d, 0x42
+ };
+
+
+
+
+// ---------------------------------------------------------
+// ConstructL is called by the application framework
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::ConstructL()
+ {
+ BaseConstructL();
+
+ // create appview
+ iAppView = CHapticsTestAppView::NewL( ClientRect() );
+ AddToStackL( iAppView );
+
+ // create effect data handler
+ iEffectData = CHapticsTestEffectDataHandler::NewL();
+
+ // create async play sender
+ iAsyncPlaySender = new ( ELeave ) CHapticsTestAsyncPlaySender( this );
+
+ FindIVTFiles();
+
+ iAppView->InsertOutput( _L("Haptics usage from options menu.") );
+ }
+
+// ---------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------
+//
+CHapticsTestAppUi::CHapticsTestAppUi()
+ : iSynchronous( ETrue ), iUseHandle( EFalse ), iUsesMemCard( EFalse )
+ {
+ // no implementation required
+ }
+
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+//
+CHapticsTestAppUi::~CHapticsTestAppUi()
+ {
+ if (iAppView)
+ {
+ RemoveFromStack( iAppView );
+ delete iAppView;
+ iAppView = NULL;
+ }
+
+ if( iHaptics )
+ {
+ delete iHaptics;
+ iHaptics = NULL;
+ }
+
+ if ( iTempHaptics )
+ {
+ delete iTempHaptics;
+ iTempHaptics = NULL;
+ }
+
+ delete iEffectData;
+
+ iIVTFileArray.Close();
+
+ while ( iLoadedIVTFileArray.Count() )
+ {
+ delete iLoadedIVTFileArray[0].iDataBuffer;
+ iLoadedIVTFileArray.Remove( 0 );
+ }
+
+ iLoadedIVTFileArray.Close();
+
+ if ( iAsyncPlaySender )
+ {
+ iAsyncPlaySender->Cancel();
+ delete iAsyncPlaySender;
+ iAsyncPlaySender = NULL;
+ }
+ }
+
+// ---------------------------------------------------------
+// handle any menu commands
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::HandleCommandL( TInt aCommand )
+ {
+ switch( aCommand )
+ {
+ case EEikCmdExit:
+ case EAknSoftkeyExit:
+ Exit();
+ break;
+
+ case EHapticsTestOpenHaptics:
+ {
+ OpenHapticsL();
+ }
+ break;
+
+ case EHapticsTestAutoInit:
+ {
+ // automatically create haptics instance, fetch supported
+ // actuators, and open Any-actuator
+ OpenHapticsL();
+ FetchSupportedActuators();
+ OpenActuator( EHWRMLogicalActuatorAny );
+ }
+ break;
+
+ case EHapticsTestSupportedActuators:
+ {
+ FetchSupportedActuators();
+ }
+ break;
+
+ case EHapticsTestOpenActuator:
+ case EHapticsTestOpenActuatorAny:
+ {
+ OpenActuator( EHWRMLogicalActuatorAny );
+ }
+ break;
+ case EHapticsTestOpenActuatorDevice:
+ {
+ OpenActuator( EHWRMLogicalActuatorDevice );
+ }
+ break;
+ case EHapticsTestOpenActuatorPrimaryDisplay:
+ {
+ OpenActuator( EHWRMLogicalActuatorPrimaryDisplay );
+ }
+ break;
+ case EHapticsTestOpenActuatorSecondaryDisplay:
+ {
+ OpenActuator( EHWRMLogicalActuatorSecondaryDisplay );
+ }
+ break;
+ case EHapticsTestOpenActuatorGame:
+ {
+ OpenActuator( EHWRMLogicalActuatorGame );
+ }
+ break;
+ case EHapticsTestOpenActuatorGameLeft:
+ {
+ OpenActuator( EHWRMLogicalActuatorGameLeft );
+ }
+ break;
+ case EHapticsTestOpenActuatorGameRight:
+ {
+ OpenActuator( EHWRMLogicalActuatorGameRight );
+ }
+ break;
+ case EHapticsTestOpenActuatorExternalVibra:
+ {
+ OpenActuator( EHWRMLogicalActuatorExternalVibra );
+ }
+ break;
+
+ case EHapticsTestLoadIVTFile:
+ case EHapticsTestLoadIVTFileNoneFound:
+ {
+ // nothing to do
+ }
+ break;
+ case EHapticsTestLoadIVTFileSelected:
+ {
+ // open selected file
+ TInt index = iMenuPane->SelectedItem();
+ LoadIVTDataL( iIVTFileArray[index] );
+ }
+ break;
+
+ case EHapticsTestPlayEffect:
+ case EHapticsTestPlayEffectNoneFound:
+ {
+ // nothing to do
+ }
+ break;
+ case EHapticsTestPlayEffectSelected:
+ {
+ // play selected effect
+ TInt index = CountFileHandleAndEffectIndex( iMenuPane->SelectedItem() );
+ PlayEffect( index );
+ PrintEffectInfo( index );
+ }
+ break;
+ case EHapticsTestPlayEffectRepeat:
+ case EHapticsTestPlayEffectRepeatNoneFound:
+ {
+ // nothing to do
+ }
+ break;
+ case EHapticsTestPlayEffectRepeatSelected:
+ {
+ // play selected effect repeatedly
+ TInt index = CountFileHandleAndEffectIndex( iMenuPane->SelectedItem() );
+ RepeatEffect( index, GetNumberOfRepeats() );
+ PrintEffectInfo( index );
+ }
+ break;
+
+ case EHapticsTestPlayEffectManual:
+ {
+ // nothing to do
+ }
+ break;
+ case EHapticsTestPlayEffectManualMagSweep:
+ {
+ PlayMagSweepL();
+ }
+ break;
+ case EHapticsTestPlayEffectManualMagSweepInf:
+ {
+ PlayMagSweepL( ETrue );
+ }
+ break;
+ case EHapticsTestPlayEffectManualMagSweepInfMod:
+ {
+ PlayMagSweepL( ETrue, ETrue );
+ }
+ break;
+ case EHapticsTestPlayEffectManualPeriodic:
+ {
+ PlayPeriodicL();
+ }
+ break;
+ case EHapticsTestPlayEffectManualPeriodicInf:
+ {
+ PlayPeriodicL( ETrue );
+ }
+ break;
+ case EHapticsTestPlayEffectManualPeriodicInfMod:
+ {
+ PlayPeriodicL( ETrue, ETrue );
+ }
+ break;
+ case EHapticsTestPlayEffectManualRepeat:
+ {
+ PlayRepeatL( GetNumberOfRepeats() );
+ }
+ break;
+
+ case EHapticsTestChangeState:
+ case EHapticsTestChangeStateNoneFound:
+ {
+ // nothing to do
+ }
+ break;
+
+ case EHapticsTestChangeStatePause:
+ {
+ // get itemindex and pause effect
+ TInt itemIndex = iMenuPane->SelectedItem();
+ PauseEffect( itemIndex );
+ }
+ break;
+
+ case EHapticsTestChangeStateResume:
+ {
+ // get itemindex and resume effect
+ TInt itemIndex = iMenuPane->SelectedItem();
+ ResumeEffect( itemIndex );
+ }
+ break;
+
+ case EHapticsTestChangeStateStop:
+ {
+ // get itemindex and stop effect
+ TInt itemIndex = iMenuPane->SelectedItem();
+ StopEffect( itemIndex );
+ }
+ break;
+
+ case EHapticsTestChangeStateStopAll:
+ {
+ TInt err = iHaptics->StopAllPlayingEffects();
+ if ( err )
+ {
+ TBuf<8> errBuf;
+ errBuf.AppendNum( err );
+ iAppView->InsertOutput( _L("Stopping all effects failed, err = "), EFalse );
+ iAppView->InsertOutput( errBuf );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Stopping all effects succeeded.") );
+
+ // reset the auto-modification
+ iEffectData->ResetModifiableEffectTimer();
+ }
+ }
+ break;
+
+ case EHapticsTestModifyEffect:
+ {
+ // nothing to do
+ }
+ break;
+ case EHapticsTestModifyEffectDuration1:
+ {
+ iEffectData->SetDuration( KEffectDuration1 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectDuration5:
+ {
+ iEffectData->SetDuration( KEffectDuration5 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectDuration10:
+ {
+ iEffectData->SetDuration( KEffectDuration10 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectDuration30:
+ {
+ iEffectData->SetDuration( KEffectDuration30 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectDuration60:
+ {
+ iEffectData->SetDuration( KEffectDuration60 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectMagnitudeMin:
+ {
+ iEffectData->SetMagnitude( KHWRMHapticsMinMagnitude );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectMagnitude25:
+ {
+ iEffectData->SetMagnitude( KEffectMagnitude25 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectMagnitude50:
+ {
+ iEffectData->SetMagnitude( KEffectMagnitude50 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectMagnitude75:
+ {
+ iEffectData->SetMagnitude( KEffectMagnitude75 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectMagnitudeMax:
+ {
+ iEffectData->SetMagnitude( KHWRMHapticsMaxMagnitude );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectStyleSmooth:
+ {
+ iEffectData->SetStyle( CHWRMHaptics::EHWRMHapticsStyleSmooth );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectStyleStrong:
+ {
+ iEffectData->SetStyle( CHWRMHaptics::EHWRMHapticsStyleStrong );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectStyleSharp:
+ {
+ iEffectData->SetStyle( CHWRMHaptics::EHWRMHapticsStyleSharp );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackMin:
+ {
+ iEffectData->SetAttackLevel( KHWRMHapticsMinMagnitude );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttack25:
+ {
+ iEffectData->SetAttackLevel( KEffectMagnitude25 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttack50:
+ {
+ iEffectData->SetAttackLevel( KEffectMagnitude50 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttack75:
+ {
+ iEffectData->SetAttackLevel( KEffectMagnitude75 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackMax:
+ {
+ iEffectData->SetAttackLevel( KHWRMHapticsMaxMagnitude );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeMin:
+ {
+ iEffectData->SetFadeLevel( KHWRMHapticsMinMagnitude );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFade25:
+ {
+ iEffectData->SetFadeLevel( KEffectMagnitude25 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFade50:
+ {
+ iEffectData->SetFadeLevel( KEffectMagnitude50 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFade75:
+ {
+ iEffectData->SetFadeLevel( KEffectMagnitude75 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeMax:
+ {
+ iEffectData->SetFadeLevel( KHWRMHapticsMaxMagnitude );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackTime02:
+ {
+ iEffectData->SetAttackTime( KEffectAttackTime02 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackTime1:
+ {
+ iEffectData->SetAttackTime( KEffectAttackTime1 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackTime5:
+ {
+ iEffectData->SetAttackTime( KEffectAttackTime5 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackTime10:
+ {
+ iEffectData->SetAttackTime( KEffectAttackTime10 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackTime30:
+ {
+ iEffectData->SetAttackTime( KEffectAttackTime30 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectAttackTime60:
+ {
+ iEffectData->SetAttackTime( KEffectAttackTime60 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeTime02:
+ {
+ iEffectData->SetFadeTime( KEffectFadeTime02 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeTime1:
+ {
+ iEffectData->SetFadeTime( KEffectFadeTime1 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeTime5:
+ {
+ iEffectData->SetFadeTime( KEffectFadeTime5 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeTime10:
+ {
+ iEffectData->SetFadeTime( KEffectFadeTime10 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeTime30:
+ {
+ iEffectData->SetFadeTime( KEffectFadeTime30 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectFadeTime60:
+ {
+ iEffectData->SetFadeTime( KEffectFadeTime60 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectPeriod50:
+ {
+ iEffectData->SetPeriod( KEffectPeriod50 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectPeriod100:
+ {
+ iEffectData->SetPeriod( KEffectPeriod100 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectPeriod300:
+ {
+ iEffectData->SetPeriod( KEffectPeriod300 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectPeriod600:
+ {
+ iEffectData->SetPeriod( KEffectPeriod600 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectPeriod1000:
+ {
+ iEffectData->SetPeriod( KEffectPeriod1000 );
+ ModifyEffect();
+ }
+ break;
+ case EHapticsTestModifyEffectPeriod3000:
+ {
+ iEffectData->SetPeriod( KEffectPeriod3000 );
+ ModifyEffect();
+ }
+ break;
+
+ case EHapticsTestCloseHaptics:
+ {
+ CloseHaptics();
+ }
+ break;
+
+ case EHapticsTestSynchronousCalls:
+ {
+ iSynchronous = ETrue;
+ iAppView->InsertOutput( _L("Using synchronous methods.") );
+ }
+ break;
+
+ case EHapticsTestAsynchronousCalls:
+ {
+ iSynchronous = EFalse;
+ iAppView->InsertOutput( _L("Using asynchronous methods.") );
+ }
+ break;
+
+ case EHapticsTestUsingFileHandle:
+ {
+ iUseHandle = ETrue;
+ iAppView->InsertOutput( _L("Using file handle in play methods.") );
+ }
+ break;
+
+ case EHapticsTestNotUsingFileHandle:
+ {
+ iUseHandle = EFalse;
+ iAppView->InsertOutput( _L("Using data buffer in play methods.") );
+ }
+ break;
+
+ case EHapticsTestShowEffectInfo:
+ {
+ iShowEffectInfo = ETrue;
+ iAppView->InsertOutput( _L("Shows information of played effect.") );
+ }
+ break;
+
+ case EHapticsTestHideEffectInfo:
+ {
+ iShowEffectInfo = EFalse;
+ iAppView->InsertOutput( _L("Stops showing information of played effect.") );
+ }
+ break;
+
+ case EHapticsTestDeleteIVTData:
+ case EHapticsTestDeleteIVTDataNoneFound:
+ {
+ // nothing to do
+ }
+ break;
+
+ case EHapticsTestDeleteIVTDataSelected:
+ {
+ // delete selected loaded IVT file
+ TInt index = iMenuPane->SelectedItem();
+ DeleteLoadedIVTData( index );
+ }
+ break;
+
+ case EHapticsTestDeleteAllIVTData:
+ {
+ // delete all loaded IVT files
+ DeleteAllLoadedIVTData();
+ }
+ break;
+
+ case EHapticsTestReserve:
+ {
+ // nothing to do
+ }
+ case EHapticsTestReserveNotTrusted:
+ {
+ ReserveHaptics( iHaptics, EFalse );
+ }
+ break;
+ case EHapticsTestReserveTrusted:
+ {
+ ReserveHaptics( iHaptics, ETrue );
+ }
+ break;
+ case EHapticsTestReserveNotTrustedTemp:
+ {
+ // create the temp haptics client, if it does not exist
+ if ( !iTempHaptics )
+ {
+ iTempHaptics = CHWRMHaptics::NewL( NULL, NULL );
+ }
+
+ ReserveHaptics( iTempHaptics, EFalse );
+ }
+ break;
+ case EHapticsTestRelease:
+ {
+ iHaptics->ReleaseHaptics();
+ iAppView->InsertOutput( _L("Reservation released.") );
+ }
+ break;
+ case EHapticsTestReleaseTemp:
+ {
+ if ( iTempHaptics )
+ {
+ iTempHaptics->ReleaseHaptics();
+ iAppView->InsertOutput( _L("Temp client's reservation released.") );
+
+ delete iTempHaptics;
+ iTempHaptics = NULL;
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Temp client not created/reserved.") );
+ }
+ }
+ break;
+
+ case EHapticsTestConstGetters:
+ {
+ ConstGetters();
+ }
+ break;
+
+ case EHapticsTestGetStatus:
+ {
+ // fetch haptics status, and print it
+ MHWRMHapticsObserver::THWRMHapticsStatus status =
+ iHaptics->HapticsStatus();
+
+ if ( iTempHaptics )
+ {
+ iAppView->InsertOutput( _L("[Haptics client] - "), EFalse );
+ PrintStatusInfo( status );
+
+ status = iTempHaptics->HapticsStatus();
+ iAppView->InsertOutput( _L("[Temporary client] - "), EFalse );
+ PrintStatusInfo( status );
+ }
+ else
+ {
+ PrintStatusInfo( status );
+ }
+
+ }
+ break;
+
+ case EHapticsTestSetPropertyPriorityMin:
+ {
+ SetPropertyPriorityMin();
+ }
+ break;
+
+ case EHapticsTestSetPropertyPriorityDefault:
+ {
+ SetPropertyPriorityDefault();
+ }
+ break;
+
+ case EHapticsTestSetPropertyPriorityMax:
+ {
+ SetPropertyPriorityMax();
+ }
+ break;
+
+ case EHapticsTestSetPropertyDisableEffectsTrue:
+ {
+ SetPropertyDisableEffectsTrue();
+ }
+ break;
+
+ case EHapticsTestSetPropertyDisableEffectsFalse:
+ {
+ SetPropertyDisableEffectsFalse();
+ }
+ break;
+
+ case EHapticsTestSetPropertyStrengthMute:
+ {
+ SetPropertyStrengthMin();
+ }
+ break;
+
+ case EHapticsTestSetPropertyStrengthHalf:
+ {
+ SetPropertyStrengthMiddle();
+ }
+ break;
+
+ case EHapticsTestSetPropertyStrengthFull:
+ {
+ SetPropertyStrengthMax();
+ }
+ break;
+
+ case EHapticsTestGetPropertyPriority:
+ {
+ GetPropertyPriority();
+ }
+ break;
+
+ case EHapticsTestGetPropertyDisableEffects:
+ {
+ GetPropertyDisableEffects();
+ }
+ break;
+
+ case EHapticsTestGetPropertyStrength:
+ {
+ GetPropertyStrength();
+ }
+ break;
+
+
+ case EHapticsTestGetCapabilityDeviceCategory:
+ {
+ GetCapabilityDeviceCategory();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityMaxNestedRepeats:
+ {
+ GetCapabilityMaxNestedRepeats();
+ }
+ break;
+
+
+ case EHapticsTestGetCapabilityNumActuators:
+ {
+ GetCapabilityNumActuators();
+ }
+ break;
+
+
+ case EHapticsTestGetCapabilityActuatorType:
+ {
+ GetCapabilityActuatorType();
+ }
+ break;
+
+
+ case EHapticsTestGetCapabilityNumEffectSlots:
+ {
+ GetCapabilityNumEffectSlots();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityNumEffectStyles:
+ {
+ GetCapabilityNumEffectStyles();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityMinPeriod:
+ {
+ GetCapabilityMinPeriod();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityMaxPeriod:
+ {
+ GetCapabilityMaxPeriod();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityMaxEffectDuration:
+ {
+ GetCapabilityMaxEffectDuration();
+ }
+ break;
+
+ case EHapticsTestGetCapabilitySupportedEffects:
+ {
+ GetCapabilitySupportedEffects();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityDeviceName:
+ {
+ GetCapabilityDeviceName();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityMaxEnvelopeTime:
+ {
+ GetCapabilityMaxEnvelopeTime();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityAPIVersionNumber:
+ {
+ GetCapabilityAPIVersionNumber();
+ }
+ break;
+
+ case EHapticsTestGetCapabilityMaxIVTSize:
+ {
+ GetCapabilityMaxIVTSize();
+ }
+ break;
+
+ case EHapticsTestClearOutput:
+ {
+ iAppView->ClearOutput();
+ }
+ break;
+
+ case EHapticsTestStreaming:
+ {
+ StartStreaming();
+ }
+ break;
+
+ case EHapticsTestPlayStreamSample:
+ case EHapticsTestNextStreamSample:
+ {
+ PlayStreamingSample( iCurrentSample );
+ iCurrentSample >= KSampleCount ? iCurrentSample = 0 : iCurrentSample++;
+ }
+ break;
+
+ case EHapticsTestPlayAllSamples:
+ {
+ for ( TInt n = 0; n < 8; n++ )
+ {
+ PlayStreamingSample( n );
+ User::After( 300000 );
+ }
+ }
+ break;
+
+ case EHapticsTestStopStreaming:
+ {
+ StopStreaming();
+ }
+ break;
+
+ case EHapticsTestPanic:
+ default:
+ Panic( EHapticsTestBasicUi );
+ break;
+ }
+ }
+
+// ---------------------------------------------------------
+// Manages the options menu contents based on user actions and data.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ CAknAppUi::DynInitMenuPaneL( aResourceId, aMenuPane );
+
+ // store menupane to be used in HandleCommandL()
+ iMenuPane = aMenuPane;
+
+ if ( aResourceId == R_HAPTICSTEST_MENU )
+ {
+ if ( !iHaptics )
+ {
+ // haptics client not created, hide commands using it
+ aMenuPane->SetItemDimmed( EHapticsTestReserve, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestConstGetters, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestGetStatus, ETrue );
+ }
+ if ( !iActuatorOpened )
+ {
+ // Actuator has not been opened yet, hide ivt-file loading
+ // submenu and general play-submenu
+ aMenuPane->SetItemDimmed( EHapticsTestGeneralPlayEffect, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestLoadIVTFile, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestPropertiesSubmenu, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestCapabilitiesSubmenu, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestStreaming, ETrue );
+ }
+ if ( 0 == iLoadedIVTFileArray.Count() )
+ {
+ // also hide the deleteIVT data related menu items
+ aMenuPane->SetItemDimmed( EHapticsTestDeleteIVTData, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestDeleteAllIVTData, ETrue );
+ }
+ if ( !iEffectData->Count() )
+ {
+ // hide the pause/resume/stop submenu
+ aMenuPane->SetItemDimmed( EHapticsTestChangeState, ETrue );
+ }
+ if ( !iEffectData->ModifiableEffectExists() )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestModifyEffect, ETrue );
+ }
+ if ( iStreaming )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestStreaming, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestReserve, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestLoadIVTFile, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestGeneralPlayEffect, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestChangeState, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestModifyEffect, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestDeleteIVTData, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestPropertiesSubmenu, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestCapabilitiesSubmenu, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestDeleteAllIVTData, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestGetStatus, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestConstGetters, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestClearOutput, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestPanic, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestInit, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsToggle, ETrue );
+ aMenuPane->SetItemDimmed( EAknSoftkeyExit, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestPlayStreamSample, iCurrentSample );
+ aMenuPane->SetItemDimmed( EHapticsTestNextStreamSample, !iCurrentSample );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestPlayAllSamples, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestPlayStreamSample, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestNextStreamSample, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestStopStreaming, ETrue );
+ }
+ }
+ else if ( aResourceId == R_HAPTICSTEST_INIT_SUBMENU )
+ {
+ if ( !iHaptics )
+ {
+ // haptics client not created, hide commands using it
+ aMenuPane->SetItemDimmed( EHapticsTestSupportedActuators, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuator, ETrue );
+ }
+ if ( !iSupportedActuators )
+ {
+ // either there are no supported actuators, or they have not
+ // been fethed yet --> hide actuator opening submenu
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuator, ETrue );
+ }
+ }
+ else if ( aResourceId == R_HAPTICSTEST_GENERALPLAY_SUBMENU )
+ {
+ if ( !iActuatorOpened )
+ {
+ // Actuator has not been opened yet, hide the manual effect
+ // play submenu
+ aMenuPane->SetItemDimmed( EHapticsTestPlayEffectManual, ETrue );
+ }
+ if ( 0 == iLoadedIVTFileArray.Count() )
+ {
+ // IVT-data has not been loaded, hide the effect submenu
+ aMenuPane->SetItemDimmed( EHapticsTestPlayEffect, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestPlayEffectRepeat, ETrue );
+ }
+ }
+ else if ( aResourceId == R_HAPTICSTEST_TOGGLE_SUBMENU )
+ {
+ if ( iSynchronous )
+ {
+ // synchronous calls in ON, hide synchronous call selection
+ aMenuPane->SetItemDimmed( EHapticsTestSynchronousCalls, ETrue );
+ }
+ else
+ {
+ // asynchronous calls in ON, hide asynchronous call selection
+ aMenuPane->SetItemDimmed( EHapticsTestAsynchronousCalls, ETrue );
+ }
+ if ( iUseHandle )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestUsingFileHandle, ETrue );
+ if ( iShowEffectInfo )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestShowEffectInfo, ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestHideEffectInfo, ETrue );
+ }
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestNotUsingFileHandle, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestShowEffectInfo, ETrue );
+ aMenuPane->SetItemDimmed( EHapticsTestHideEffectInfo, ETrue );
+ }
+ }
+ else if ( aResourceId == R_HAPTICSTEST_ACTUATORS_SUBMENU )
+ {
+ if ( !(EHWRMLogicalActuatorAny & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorAny, ETrue );
+ }
+ if ( !(EHWRMLogicalActuatorDevice & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorDevice, ETrue );
+ }
+ if ( !(EHWRMLogicalActuatorPrimaryDisplay & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorPrimaryDisplay, ETrue );
+ }
+ if ( !(EHWRMLogicalActuatorSecondaryDisplay & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorSecondaryDisplay, ETrue );
+ }
+ if ( !(EHWRMLogicalActuatorGame & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorGame, ETrue );
+ }
+ if ( !(EHWRMLogicalActuatorGameLeft & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorGameLeft, ETrue );
+ }
+ if ( !(EHWRMLogicalActuatorGameRight & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorGameRight, ETrue );
+ }
+ if ( !(EHWRMLogicalActuatorExternalVibra & iSupportedActuators) )
+ {
+ aMenuPane->SetItemDimmed( EHapticsTestOpenActuatorExternalVibra, ETrue );
+ }
+ }
+ else if ( aResourceId == R_HAPTICSTEST_IVTFILES_SUBMENU )
+ {
+ if ( iIVTFileArray.Count() )
+ {
+ // ivt-files present, hide the "no files" -item
+ aMenuPane->SetItemDimmed( EHapticsTestLoadIVTFileNoneFound, ETrue );
+
+ // make file names visible in the submenu
+ CEikMenuPaneItem::SData data;
+ for ( TInt i = 0; i < iIVTFileArray.Count(); ++i )
+ {
+ data.iText.Copy( iIVTFileArray[i] );
+ data.iCommandId = EHapticsTestLoadIVTFileSelected;
+ data.iCascadeId = 0;
+ data.iFlags = 0;
+ data.iExtraText = KNullDesC;
+
+ aMenuPane->AddMenuItemL( data );
+ }
+ }
+ }
+ else if ( aResourceId == R_HAPTICSTEST_PLAYEFFECT_SUBMENU )
+ {
+ CreatePlayEffectSubmenuL( aMenuPane,
+ EHapticsTestPlayEffectSelected,
+ EHapticsTestPlayEffectNoneFound );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_PLAYEFFECTREPEAT_SUBMENU )
+ {
+ CreatePlayEffectSubmenuL( aMenuPane,
+ EHapticsTestPlayEffectRepeatSelected,
+ EHapticsTestPlayEffectRepeatNoneFound );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_DELETEIVTDATA_SUBMENU )
+ {
+ if ( iLoadedIVTFileArray.Count() )
+ {
+ // loaded ivt-files present, hide the "no files" -item
+ aMenuPane->SetItemDimmed( EHapticsTestDeleteIVTDataNoneFound, ETrue );
+
+ // make loaded ivt-files visible in the submenu
+ CEikMenuPaneItem::SData data;
+ for ( TInt i = 0; i < iLoadedIVTFileArray.Count(); ++i )
+ {
+ data.iText.Copy( iLoadedIVTFileArray[i].iFileName );
+ data.iCommandId = EHapticsTestDeleteIVTDataSelected;
+ data.iCascadeId = 0;
+ data.iFlags = 0;
+ data.iExtraText = KNullDesC;
+
+ aMenuPane->AddMenuItemL( data );
+ }
+ }
+ }
+ else if ( aResourceId == R_HAPTICSTEST_PAUSE_SUBMENU )
+ {
+ // fill effect history data to pause submenu
+ iEffectData->DynInitChangeEffectStateSubmenuL(
+ aMenuPane, EHapticsTestChangeStatePause, iHaptics );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_RESUME_SUBMENU )
+ {
+ // fill effect history data to resume submenu
+ iEffectData->DynInitChangeEffectStateSubmenuL(
+ aMenuPane, EHapticsTestChangeStateResume, iHaptics );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_STOP_SUBMENU )
+ {
+ // fill effect history data to stop submenu
+ iEffectData->DynInitChangeEffectStateSubmenuL(
+ aMenuPane, EHapticsTestChangeStateStop, iHaptics );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYDURATION_SUBMENU )
+ {
+ iEffectData->DynInitDurationSubmenu( aMenuPane );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYMAGNITUDE_SUBMENU )
+ {
+ iEffectData->DynInitMagnitudeSubmenu( aMenuPane );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYSTYLE_SUBMENU )
+ {
+ iEffectData->DynInitStyleSubmenu( aMenuPane );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYATTACK_SUBMENU )
+ {
+ iEffectData->DynInitAttackLevelSubmenu( aMenuPane );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYFADE_SUBMENU )
+ {
+ iEffectData->DynInitFadeLevelSubmenu( aMenuPane );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYATTACKTIME_SUBMENU )
+ {
+ iEffectData->DynInitAttackTimeSubmenu( aMenuPane );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYFADETIME_SUBMENU )
+ {
+ iEffectData->DynInitFadeTimeSubmenu( aMenuPane );
+ }
+ else if ( aResourceId == R_HAPTICSTEST_MODIFYPERIOD_SUBMENU )
+ {
+ iEffectData->DynInitPeriodSubmenu( aMenuPane );
+ }
+ }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination)
+ {
+ CAknAppUi::HandleWsEventL(aEvent, aDestination);
+
+ TInt eventType = aEvent.Type();
+ if (eventType == EEventKeyUp)
+ {
+ TKeyEvent key = *(aEvent.Key());
+ GetAliasKeyCodeL(key.iCode, key, EEventKey);
+ TUint code = key.iScanCode;
+
+ if (code == '5' && !iActuatorOpened )
+ {
+ HandleCommandL(EHapticsTestOpenHaptics); // open client
+ HandleCommandL(EHapticsTestSupportedActuators); // ask supported actuators
+ HandleCommandL(EHapticsTestOpenActuatorAny); // open any actuator
+
+ HandleCommandL(EHapticsTestGetCapabilityDeviceName);
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Prints received haptics status notifications onto
+// the screen.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::HapticsStatusChangedL( THWRMHapticsStatus aStatus )
+ {
+ PrintStatusInfo( aStatus );
+ }
+
+// ---------------------------------------------------------
+// Empty implementation.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::EffectCompletedL( TInt /*aError*/,
+ TInt /*aEffectHandle*/ )
+ {
+ }
+
+// ---------------------------------------------------------
+// Outputs received actuator events onto the screen.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::ActuatorEventL( THWRMActuatorEvents aEvent,
+ THWRMLogicalActuators aActuator )
+ {
+ // actuator name
+ TBuf<64> actuator;
+ switch( aActuator )
+ {
+ case EHWRMLogicalActuatorAny:
+ actuator.Append( _L("Any") );
+ break;
+ case EHWRMLogicalActuatorDevice:
+ actuator.Append( _L("Device") );
+ break;
+ case EHWRMLogicalActuatorPrimaryDisplay:
+ actuator.Append( _L("PrimaryDisplay") );
+ break;
+ case EHWRMLogicalActuatorSecondaryDisplay:
+ actuator.Append( _L("SecondaryDisplay") );
+ break;
+ case EHWRMLogicalActuatorGame:
+ actuator.Append( _L("Game") );
+ break;
+ case EHWRMLogicalActuatorGameLeft:
+ actuator.Append( _L("GameLeft") );
+ break;
+ case EHWRMLogicalActuatorGameRight:
+ actuator.Append( _L("GameRight") );
+ break;
+ case EHWRMLogicalActuatorExternalVibra:
+ actuator.Append( _L("ExternalVibra") );
+ break;
+ default:
+ actuator.Append( _L("<unknown>") );
+ break;
+ }
+
+ iAppView->InsertOutput( _L("Received actuator event: "), EFalse );
+ iAppView->InsertOutput( actuator, EFalse );
+
+ switch( aEvent )
+ {
+ case MHWRMHapticsActuatorObserver::EHWRMActuatorAttached:
+ {
+ iAppView->InsertOutput( _L(" Attached.") );
+ break;
+ }
+ case MHWRMHapticsActuatorObserver::EHWRMActuatorDetached:
+ {
+ iAppView->InsertOutput( _L(" Deattached.") );
+ break;
+ }
+ case MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled:
+ {
+ iAppView->InsertOutput( _L(" Enabled.") );
+ break;
+ }
+ case MHWRMHapticsActuatorObserver::EHWRMActuatorDisabled:
+ {
+ iAppView->InsertOutput( _L(" Disabled.") );
+ break;
+ }
+ default:
+ {
+ iAppView->InsertOutput( _L(" <unknown status>") );
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Creates haptics client instance.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::OpenHapticsL()
+ {
+ if ( iHaptics )
+ {
+ iAppView->InsertOutput( _L("Already created.") );
+ }
+ else
+ {
+ // Create haptics client
+ if ( iSynchronous )
+ {
+ iHaptics = CHWRMHaptics::NewL( this, this );
+ }
+ else
+ {
+ // asynchronous creation
+ TRequestStatus status;
+ iHaptics = CHWRMHaptics::NewL( this, this, status );
+ User::WaitForRequest( status );
+ User::LeaveIfError( status.Int() );
+ }
+
+ if ( iHaptics )
+ {
+ iAppView->InsertOutput( _L("Haptics client created.") );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Error: Creation failed.") );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Deletes haptics client instance, and resets member variables
+// so that options-menu is updated accordingly.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::CloseHaptics()
+ {
+ if( iHaptics )
+ {
+ delete iHaptics;
+ iHaptics = NULL;
+ iAppView->InsertOutput( _L("Haptics client deleted.") );
+
+ // uninit members
+ iSupportedActuators = 0;
+ iActuatorOpened = EFalse;
+ iIVTFileHandle = 0;
+
+ while ( iLoadedIVTFileArray.Count() )
+ {
+ if ( iLoadedIVTFileArray[0].iDataBuffer )
+ {
+ delete iLoadedIVTFileArray[0].iDataBuffer;
+ iLoadedIVTFileArray[0].iDataBuffer = NULL;
+ }
+ iLoadedIVTFileArray.Remove( 0 );
+ }
+
+ iIVTDataBuffer = NULL;
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Error: Haptics client doesn\'t exist.") );
+ }
+ }
+
+// ---------------------------------------------------------
+// Fetches the supported actuators from haptics server,
+// and stores the mask to iSupportedActuators.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::FetchSupportedActuators()
+ {
+ TInt err = iHaptics->SupportedActuators( iSupportedActuators );
+
+ if ( err )
+ {
+ iAppView->InsertOutput( _L("Error: Getting supported actuators failed.") );
+ }
+ else
+ {
+ PrintSupportedActuators();
+ }
+ }
+
+// ---------------------------------------------------------
+// Prints the given supported actuators to the UI.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PrintSupportedActuators()
+ {
+ iAppView->InsertOutput( _L("Supported actuators:") );
+
+ if( EHWRMLogicalActuatorAny & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorAny") );
+ }
+ if( EHWRMLogicalActuatorDevice & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorDevice") );
+ }
+ if( EHWRMLogicalActuatorPrimaryDisplay & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorPrimaryDisplay") );
+ }
+ if( EHWRMLogicalActuatorSecondaryDisplay & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorSecondaryDisplay") );
+ }
+ if( EHWRMLogicalActuatorGame & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorGame") );
+ }
+ if( EHWRMLogicalActuatorGameLeft & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorGameLeft") );
+ }
+ if( EHWRMLogicalActuatorGameRight & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorGameRight") );
+ }
+ if( EHWRMLogicalActuatorExternalVibra & iSupportedActuators )
+ {
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorExternalVibra") );
+ }
+ if( EHWRMLogicalActuatorLast & iSupportedActuators )
+ {
+ // ?????
+ iAppView->InsertOutput( _L(" EHWRMLogicalActuatorLast") );
+ }
+ }
+
+// ---------------------------------------------------------
+// Attemps to open the given actuator. Prints the result
+// of the attemp to the UI.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::OpenActuator( THWRMLogicalActuators aActuator )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( aActuator ) );
+ TBuf<100> buf;
+ if ( err )
+ {
+ buf.Append( _L("Error: Opening actuator failed; ") );
+ buf.AppendNum( err );
+ iAppView->InsertOutput( buf );
+
+ iActuatorOpened = EFalse;
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Actuator opened successfully.") );
+
+ iActuatorOpened = ETrue;
+
+ TInt err = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsLicensekey,
+ KNullDesC8() );
+ if (err)
+ {
+ buf.Append( _L("Error: Setting licensefailed: ") );
+ buf.AppendNum( err );
+ iAppView->InsertOutput( buf );
+
+ iActuatorOpened = EFalse;
+ return;
+ }
+ iAppView->InsertOutput( _L("License is set.") );
+
+ err = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+
+ }
+ }
+
+// ---------------------------------------------------------
+// Reserves haptics for this application.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::ReserveHaptics( CHWRMHaptics* aHaptics,
+ TBool aForceNoCoe )
+ {
+ TInt err = KErrNone;
+ TBuf<24> forceNoCoe;
+
+ if ( aForceNoCoe )
+ {
+ forceNoCoe.Append( _L("(trusted).") );
+ TRAP( err, aHaptics->ReserveHapticsL( ETrue ) );
+ }
+ else
+ {
+ forceNoCoe.Append( _L("(not trusted).") );
+ TRAP( err, aHaptics->ReserveHapticsL() );
+ }
+
+ if ( err )
+ {
+ TBuf<8> errorCode;
+ errorCode.AppendNum( err );
+
+ iAppView->InsertOutput( _L("Reserving haptics failed err = "), EFalse );
+ iAppView->InsertOutput( errorCode );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Reserved haptics "), EFalse );
+ iAppView->InsertOutput( forceNoCoe );
+ }
+ }
+
+// ---------------------------------------------------------
+// Searches for IVT-files in the filesystem, and writes
+// them to iIVTFileArray.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::FindIVTFiles()
+ {
+ iAppView->InsertOutput( _L("Searching IVT-files...") );
+
+ // open file server session
+ RFs rfs;
+ TInt err = rfs.Connect();
+
+ if ( err )
+ {
+ iAppView->InsertOutput( _L("Error occured while opening fileserver session!") );
+ return;
+ }
+
+ // set path where to search files
+ CDir* dirList = 0;
+ TInt memCrdUsageErr = KErrNone;
+
+#ifdef __MARM_ARMV5__
+ // first, try to use mem card.. (in ARMV5 builds)
+ memCrdUsageErr = rfs.SetSessionPath( KSessionPathCrd );
+
+ if ( !memCrdUsageErr )
+ {
+ memCrdUsageErr = rfs.GetDir( KIVTFileType, KEntryAttMaskSupported,
+ ESortByName, dirList );
+ }
+ if ( !memCrdUsageErr && dirList )
+ {
+ iUsesMemCard = ETrue;
+ }
+#endif
+
+ if ( !iUsesMemCard )
+ {
+ // secondly, try to use phone mem.. (actually first in non-ARMV5 builds)
+ err = rfs.SetSessionPath( KSessionPathMem );
+
+ if ( err )
+ {
+ iAppView->InsertOutput( _L("Setting path for fileserver failed!") );
+ return;
+ }
+
+ // get directory file listing of IVT-files
+ err = rfs.GetDir( KIVTFileType, KEntryAttMaskSupported,
+ ESortByName, dirList );
+
+ if ( err || !dirList )
+ {
+ iAppView->InsertOutput( _L("Fetching folder content failed!") );
+ return;
+ }
+ }
+
+ // file server session not needed anymore, close it
+ rfs.Close();
+
+ // go through all found ivt-files and read directory
+ // entries to filenamearray
+ for( TInt i = 0; i < dirList->Count(); i++ )
+ {
+ iIVTFileArray.Append( (*dirList)[i].iName );
+
+ // print findings to the UI
+ iAppView->InsertOutput( _L(" "), EFalse );
+ iAppView->InsertOutput( (*dirList)[i].iName );
+ }
+
+ delete dirList;
+ dirList = NULL;
+ }
+
+// ---------------------------------------------------------
+// Loads IVT data from the given file to haptics.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::LoadIVTDataL( TFileName& aFile )
+ {
+ // open file server session
+ RFs rfs;
+ if ( rfs.Connect() )
+ {
+ iAppView->InsertOutput( _L("Error occured while opening fileserver session!") );
+ return;
+ }
+
+ // set path where to search files
+#ifdef __MARM_ARMV5__
+ if ( iUsesMemCard )
+ {
+ rfs.SetSessionPath( KSessionPathCrd );
+ }
+ else
+ {
+#endif
+
+ rfs.SetSessionPath( KSessionPathMem );
+
+#ifdef __MARM_ARMV5__
+ }
+#endif
+
+ RFile effectFile;
+ TInt fileSize( 0 );
+
+ User::LeaveIfError( effectFile.Open( rfs, aFile, EFileRead ) );
+
+ effectFile.Size( fileSize );
+
+ // create buffer for the IVT-data
+ HBufC8* IVTDataBuffer = HBufC8::NewLC( fileSize );
+ TPtr8 dataBufPtr = IVTDataBuffer->Des();
+
+ // read the data from file to buffer
+ effectFile.Read( dataBufPtr );
+
+ // close file handle and file server session
+ effectFile.Close();
+ rfs.Close();
+
+ // load data to haptics
+ TInt IVTFileHandle = 0;
+ TInt err = iHaptics->LoadEffectData( *IVTDataBuffer, IVTFileHandle );
+
+ if ( err )
+ {
+ CleanupStack::PopAndDestroy( IVTDataBuffer );
+
+ if ( err == KErrAlreadyExists )
+ {
+ iAppView->InsertOutput( _L("IVT-data already loaded!") );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Error loading IVT-data!") );
+ }
+ }
+ else
+ {
+ TInt count;
+ iHaptics->GetEffectCount( IVTFileHandle, count );
+
+ TLoadedIVTFileItem newItem;
+ newItem.iFileName.Copy( aFile );
+ newItem.iFileHandle = IVTFileHandle;
+ newItem.iDataBuffer = IVTDataBuffer;
+ if ( KErrNotFound == iLoadedIVTFileArray.Find( newItem, TIdentityRelation<TLoadedIVTFileItem>( TLoadedIVTFileItem::Match ) ) )
+ {
+ iLoadedIVTFileArray.AppendL( newItem );
+ CleanupStack::Pop( IVTDataBuffer ); // ownership now in the array
+ TBuf<24> handleBuf;
+ handleBuf.AppendNum( IVTFileHandle );
+ iAppView->InsertOutput( _L("IVT-data loaded succesfully!") );
+ iAppView->InsertOutput( _L(" File: "), EFalse );
+ iAppView->InsertOutput( aFile );
+ iAppView->InsertOutput( _L(" FileHandle: "), EFalse );
+ iAppView->InsertOutput( handleBuf, EFalse );
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( IVTDataBuffer );
+ iAppView->InsertOutput( _L("IVT-data already loaded!") );
+ iAppView->InsertOutput( _L(" File: "), EFalse );
+ iAppView->InsertOutput( aFile );
+ }
+ iAppView->InsertOutput( _L(" Effect count: "), EFalse );
+ TBuf<5> countBuf;
+ countBuf.AppendNum( count );
+ iAppView->InsertOutput( countBuf );
+ }
+ }
+
+// ---------------------------------------------------------
+// Plays the effect of the given index in the currently
+// loaded IVT-file.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PlayEffect( TInt aIndex )
+ {
+ TInt err = KErrNone;
+ iEffectHandle = KErrNotFound;
+ TBool usingAsyncSender( EFalse );
+
+ if ( iSynchronous )
+ {
+ iAppView->InsertOutput( _L("Playing effect synchronously...") );
+ if ( iUseHandle )
+ {
+ err = iHaptics->PlayEffect( iIVTFileHandle,
+ aIndex, iEffectHandle );
+ }
+ else
+ {
+ err = iHaptics->PlayEffect( *iIVTDataBuffer,
+ aIndex, iEffectHandle );
+ }
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Playing effect asynchronously...") );
+
+ if ( iUseHandle )
+ {
+ usingAsyncSender = ETrue;
+ iAsyncPlaySender->Play( iHaptics, iIVTFileHandle,
+ aIndex, iEffectHandle );
+ }
+ else
+ {
+ TRequestStatus status;
+ iHaptics->PlayEffect( *iIVTDataBuffer,
+ aIndex, iEffectHandle, status );
+ User::WaitForRequest( status );
+ err = status.Int();
+ }
+ }
+
+ if ( !usingAsyncSender )
+ {
+ // print error/success
+ PrintPlayEffectStatus( err );
+ GetCurrentEffectState();
+
+ // if effect played successfully, add history data
+ if ( !err )
+ {
+ iEffectData->AddEffectInfo( iEffectHandle, iIVTFileHandle, aIndex );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Plays the effect of the given index in the currently
+// loaded IVT-file repeatedly
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::RepeatEffect( TInt aIndex, TInt aRepeats )
+ {
+ TInt err = KErrNone;
+ iEffectHandle = KErrNotFound;
+ TBool usingAsyncSender( EFalse );
+
+ if ( iSynchronous )
+ {
+ _LIT( KInsertedText, "Playing Repeat %d times synchronously..." );
+ TBuf<50> buf;
+ buf.Format( KInsertedText, aRepeats );
+ iAppView->InsertOutput( buf );
+
+ if ( iUseHandle )
+ {
+ err = iHaptics->PlayEffectRepeat( iIVTFileHandle,
+ aIndex, aRepeats, iEffectHandle );
+ }
+ else
+ {
+ err = iHaptics->PlayEffectRepeat( *iIVTDataBuffer,
+ aIndex, aRepeats, iEffectHandle );
+ }
+ }
+ else
+ {
+ _LIT( KInsertedText, "Playing Repeat %d times asynchronously..." );
+ TBuf<50> buf;
+ buf.Format( KInsertedText, aRepeats );
+ iAppView->InsertOutput( buf );
+
+ if ( iUseHandle )
+ {
+ usingAsyncSender = ETrue;
+ iAsyncPlaySender->PlayRepeat( iHaptics,
+ iIVTFileHandle,
+ aIndex,
+ aRepeats,
+ iEffectHandle );
+ }
+ else
+ {
+ TRequestStatus status;
+ iHaptics->PlayEffectRepeat( *iIVTDataBuffer,
+ aIndex, aRepeats, iEffectHandle, status );
+ User::WaitForRequest( status );
+ err = status.Int();
+ }
+ }
+
+ if ( !usingAsyncSender )
+ {
+ // print error/success
+ PrintPlayEffectStatus( err );
+ GetCurrentEffectState();
+
+ // if effect played successfully, add history data
+ if ( !err )
+ {
+ iEffectData->AddEffectInfo( iEffectHandle, iIVTFileHandle, aIndex );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Plays a magsweep effect using manual definition.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PlayMagSweepL( TBool aInfinite, TBool aModifiable )
+ {
+ // construct default magsweep data
+ CHWRMHaptics::THWRMHapticsMagSweepEffect magsweep;
+ iEffectData->FillDefaultMagSweepData( magsweep, aInfinite,
+ aModifiable, iHaptics );
+
+ TInt err = KErrNone;
+ iEffectHandle = KErrNotFound;
+
+ if ( iSynchronous )
+ {
+ iAppView->InsertOutput( _L("Playing MagSweep synchronously...") );
+
+ // synchronous call
+ err = iHaptics->PlayMagSweepEffect( magsweep, iEffectHandle );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Playing MagSweep asynchronously...") );
+
+ // asynchronous call
+ TRequestStatus status;
+ iHaptics->PlayMagSweepEffect( magsweep, iEffectHandle,
+ status );
+ User::WaitForRequest( status );
+ err = status.Int();
+ }
+
+ // print error/success
+ PrintPlayEffectStatus( err );
+ GetCurrentEffectState();
+
+ // if effect played successfully, add history data
+ if ( !err )
+ {
+ iEffectData->AddEffectInfo( iEffectHandle );
+ iEffectData->ResetModifiableMagSweepEffectL( magsweep, iEffectHandle,
+ iHaptics );
+
+ // if this effect should be auto-modifiable, reset modification timer
+ if ( aModifiable )
+ {
+ iEffectData->StartModifiableEffectTimerL( ModifyPlayingEffect );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Plays a periodic effect using manual definition.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PlayPeriodicL( TBool aInfinite, TBool aModifiable )
+ {
+ // construct default periodic data
+ CHWRMHaptics::THWRMHapticsPeriodicEffect periodic;
+ iEffectData->FillDefaultPeriodicData( periodic, aInfinite,
+ aModifiable, iHaptics );
+
+ TInt err = KErrNone;
+ iEffectHandle = KErrNotFound;
+
+ if ( iSynchronous )
+ {
+ iAppView->InsertOutput( _L("Playing Periodic synchronously...") );
+
+ // synchronous call
+ err = iHaptics->PlayPeriodicEffect( periodic, iEffectHandle );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Playing Periodic asynchronously...") );
+
+ // asynchronous call
+ TRequestStatus status;
+ iHaptics->PlayPeriodicEffect( periodic, iEffectHandle,
+ status );
+ User::WaitForRequest( status );
+ err = status.Int();
+ }
+
+ // print error/success
+ PrintPlayEffectStatus( err );
+ GetCurrentEffectState();
+
+ // if effect played successfully, add history data
+ if ( !err )
+ {
+ iEffectData->AddEffectInfo( iEffectHandle );
+ iEffectData->ResetModifiablePeriodicEffectL( periodic, iEffectHandle,
+ iHaptics );
+
+ // if this effect should be auto-modifiable, reset modification timer
+ if ( aModifiable )
+ {
+ iEffectData->StartModifiableEffectTimerL( ModifyPlayingEffect );
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly a timeline effect using manual definition.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PlayRepeatL( TInt aRepeats )
+ {
+ TInt err = KErrNone;
+ iEffectHandle = KErrNotFound;
+
+ // This is a simple effect (just plays magsweep type thingie for a second)
+ // produced from VibeStudio (export to C-file functionality there..)
+ static const TUint8 simpleTimelineEffect[] =
+ {
+ 0x01, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0xf1, 0xe0, 0x01, 0xe2, 0x00, 0x00, 0xff, 0x30,
+ 0xc8, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x00,
+ 0x00, 0x5f, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0x54, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6c, 0x00,
+ 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4d, 0x00,
+ 0x61, 0x00, 0x67, 0x00, 0x53, 0x00, 0x77, 0x00, 0x65, 0x00,
+ 0x65, 0x00, 0x70, 0x00, 0x00, 0x00
+ };
+
+ RBuf8 effectBuffer;
+ CleanupClosePushL( effectBuffer );
+ effectBuffer.ReAlloc( sizeof( simpleTimelineEffect ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( effectBuffer.Ptr() );
+ memcpy( tmpPtr, simpleTimelineEffect, sizeof ( simpleTimelineEffect ) );
+ effectBuffer.SetLength( sizeof ( simpleTimelineEffect ) );
+
+ if ( iSynchronous )
+ {
+ _LIT( KInsertedText, "Playing Repeat %d times synchronously..." );
+ TBuf<50> buf;
+ buf.Format( KInsertedText, aRepeats );
+ iAppView->InsertOutput( buf );
+
+ err = iHaptics->PlayEffectRepeat( effectBuffer, 0, aRepeats, iEffectHandle );
+ }
+ else
+ {
+ _LIT( KInsertedText, "Playing Repeat %d times asynchronously..." );
+ TBuf<50> buf;
+ buf.Format( KInsertedText, aRepeats );
+ iAppView->InsertOutput( buf );
+
+ TRequestStatus status;
+ iHaptics->PlayEffectRepeat( effectBuffer, 0, aRepeats, iEffectHandle, status );
+ User::WaitForRequest( status );
+ err = status.Int();
+ }
+
+ CleanupStack::PopAndDestroy(); // effectBuffer (closed here..)
+
+ // print error/success
+ PrintPlayEffectStatus( err );
+ GetCurrentEffectState();
+
+ // if effect played successfully, add history data
+ if ( !err )
+ {
+ iEffectData->AddEffectInfo( iEffectHandle );
+ }
+ }
+
+// ---------------------------------------------------------
+// Pauses the effect of the given index in the effect
+// history data.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PauseEffect( TInt aIndex )
+ {
+ // get effect handle
+ TInt effectHandle = iEffectData->EffectHandle(aIndex);
+
+ // pause effect
+ TInt err = iHaptics->PausePlayingEffect( effectHandle );
+
+ if ( err )
+ {
+ TBuf<8> errBuf;
+ errBuf.AppendNum( err );
+ iAppView->InsertOutput( _L("Pausing effect failed, err = "), EFalse );
+ iAppView->InsertOutput( errBuf );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Pausing effect succeeded.") );
+ }
+ }
+
+// ---------------------------------------------------------
+// Resumes the effect of the given index in the effect
+// history data.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::ResumeEffect( TInt aIndex )
+ {
+ // get effect handle
+ TInt effectHandle = iEffectData->EffectHandle(aIndex);
+
+ // resume effect
+ TInt err = iHaptics->ResumePausedEffect( effectHandle );
+
+ if ( err )
+ {
+ TBuf<8> errBuf;
+ errBuf.AppendNum( err );
+ iAppView->InsertOutput( _L("Resuming effect failed, err = "), EFalse );
+ iAppView->InsertOutput( errBuf );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Resuming effect succeeded.") );
+ }
+ }
+
+// ---------------------------------------------------------
+// Stops the effect of the given index in the effect
+// history data.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::StopEffect( TInt aIndex )
+ {
+ // get effect handle
+ TInt effectHandle = iEffectData->EffectHandle(aIndex);
+
+ // stop effect
+ TInt err = iHaptics->StopPlayingEffect( effectHandle );
+
+ if ( err )
+ {
+ TBuf<8> errBuf;
+ errBuf.AppendNum( err );
+ iAppView->InsertOutput( _L("Stopping effect failed, err = "), EFalse );
+ iAppView->InsertOutput( errBuf );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Stopping effect succeeded.") );
+ }
+
+ // stop auto-modify effect, if it is on
+ iEffectData->ResetModifiableEffectTimer();
+ }
+
+// ---------------------------------------------------------
+// Deletes loaded IVT data
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::DeleteLoadedIVTData( TInt aIndex )
+ {
+ if ( 0 > aIndex || aIndex >= iLoadedIVTFileArray.Count() )
+ {
+ iAppView->InsertOutput( _L("Error: Delete index mismatch!") );
+ return;
+ }
+
+ TInt err = iHaptics->DeleteEffectData( iLoadedIVTFileArray[aIndex].iFileHandle );
+ if ( KErrNone == err )
+ {
+ // delete effect history
+ iEffectData->DeleteEffectInfo( iLoadedIVTFileArray[aIndex].iFileHandle );
+
+ // delete ivt-data item
+ if ( iLoadedIVTFileArray[aIndex].iDataBuffer )
+ {
+ delete iLoadedIVTFileArray[aIndex].iDataBuffer;
+ }
+
+ iLoadedIVTFileArray.Remove( aIndex );
+
+ iAppView->InsertOutput( _L("IVT data deletion succeeded") );
+ }
+ else
+ {
+ _LIT( KInsertedText, "IVT data deletion failed: %d" );
+ TBuf<80> buf;
+ buf.Format( KInsertedText, err );
+ iAppView->InsertOutput( buf );
+ }
+ }
+
+// ---------------------------------------------------------
+// Deletes all loaded IVT datas
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::DeleteAllLoadedIVTData()
+ {
+ iAppView->InsertOutput( _L("Deleting all loaded IVT datas.") );
+
+ TInt err = iHaptics->DeleteAllEffectData();
+
+ if ( KErrNone == err )
+ {
+ iAppView->InsertOutput( _L("All IVT data deletion succeeded") );
+
+ while ( iLoadedIVTFileArray.Count() )
+ {
+ // delete effect history
+ iEffectData->DeleteEffectInfo( iLoadedIVTFileArray[0].iFileHandle );
+
+ // delete ivt-data item
+ if ( iLoadedIVTFileArray[0].iDataBuffer )
+ {
+ delete iLoadedIVTFileArray[0].iDataBuffer;
+ }
+
+ iLoadedIVTFileArray.Remove( 0 );
+ }
+ }
+ else
+ {
+ _LIT( KInsertedText, "All IVT data deletion failed: %d" );
+ TBuf<80> buf;
+ buf.Format( KInsertedText, err );
+ iAppView->InsertOutput( buf );
+ }
+ }
+
+
+// ---------------------------------------------------------
+// Fetches the current state of the last played effect
+// (iEffectHandle), and prints the result to the UI.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCurrentEffectState()
+ {
+ TInt effectState = KErrNotFound;
+ TInt err = iHaptics->GetEffectState( iEffectHandle, effectState );
+
+ if ( err )
+ {
+ TBuf<16> errCode;
+ errCode.AppendNum( err );
+ iAppView->InsertOutput( _L(" Fetching effect state failed! Err: "), EFalse );
+ iAppView->InsertOutput( errCode );
+ }
+ else
+ {
+ TBuf<16> stateBuf;
+
+ switch ( effectState )
+ {
+ case CHWRMHaptics::EHWRMHapticsEffectNotPlaying:
+ stateBuf.Append( _L("Not playing.") );
+ break;
+ case CHWRMHaptics::EHWRMHapticsEffectPlaying:
+ stateBuf.Append( _L("Playing.") );
+ break;
+ case CHWRMHaptics::EHWRMHapticsEffectPaused:
+ stateBuf.Append( _L("Paused.") );
+ break;
+ default:
+ stateBuf.Append( _L("Unknown!") );
+ break;
+ }
+
+ iAppView->InsertOutput( _L(" Effect state: "), EFalse );
+ iAppView->InsertOutput( stateBuf );
+ }
+ }
+
+// ---------------------------------------------------------
+// Prints the status of a "play effect".
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PrintPlayEffectStatus( TInt aErrorCode ) const
+ {
+ if ( aErrorCode )
+ {
+ TBuf<16> errCode;
+ errCode.AppendNum( aErrorCode );
+ iAppView->InsertOutput( _L("Playing effect failed! Err: "), EFalse );
+ iAppView->InsertOutput( errCode );
+ }
+ else
+ {
+ TBuf<16> handleBuf;
+ handleBuf.AppendNum( iEffectHandle );
+ iAppView->InsertOutput( _L("Played effect successfully!") );
+ iAppView->InsertOutput( _L(" Effect handle: "), EFalse );
+ iAppView->InsertOutput( handleBuf );
+ }
+ }
+
+// ---------------------------------------------------------
+// Queries user how many repeats to have in case of playing
+// some effect repeatedly.
+// ---------------------------------------------------------
+//
+TInt CHapticsTestAppUi::GetNumberOfRepeats()
+ {
+ TInt repeatsIndex;
+ TInt retVal = 2; // default is 2 repeats
+
+ // Uses non-leavable new for CAknListQueryDialog construction
+ CAknListQueryDialog* query = new CAknListQueryDialog( &repeatsIndex );
+
+ if ( query )
+ {
+ query->PrepareLC( R_HAPTICS_REPEATEFFECT_REPEATS_QUERY );
+
+ if ( query->RunLD() )
+ {
+ switch ( repeatsIndex )
+ {
+ case 0:
+ retVal = 0;
+ break;
+ case 1:
+ retVal = 1;
+ break;
+ case 2:
+ retVal = 2;
+ break;
+ case 3:
+ retVal = 3;
+ break;
+ case 4:
+ retVal = 7;
+ break;
+ case 5:
+ retVal = iHaptics->InfiniteRepeat();
+ break;
+ default:
+ break; // uses default (2) as return value
+ };
+ }
+ }
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// Calculates the effect index from the submenu index.
+// ---------------------------------------------------------
+//
+TInt CHapticsTestAppUi::CountFileHandleAndEffectIndex(TInt aSubmenuIndex)
+ {
+ TInt effectFileCount = iLoadedIVTFileArray.Count();
+ TInt retVal = 0xFFFFFFFF;
+ TInt totalRunningEffectCount = 0;
+ TInt effectCountAfterPreviousFile = 0;
+
+ for ( TInt i = 0; i < effectFileCount; ++i )
+ {
+ TInt effectsInThisFile = 0;
+ iHaptics->GetEffectCount( iLoadedIVTFileArray[i].iFileHandle, effectsInThisFile );
+ effectCountAfterPreviousFile = totalRunningEffectCount;
+ totalRunningEffectCount += effectsInThisFile;
+ if ( aSubmenuIndex < totalRunningEffectCount )
+ {
+ iIVTFileHandle = iLoadedIVTFileArray[i].iFileHandle;
+ iIVTDataBuffer = iLoadedIVTFileArray[i].iDataBuffer;
+ retVal = aSubmenuIndex - effectCountAfterPreviousFile;
+ break;
+ }
+ }
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// Creates all submenu items for a play effect submenu.
+// Fetches all the names of the effects from currently
+// loaded IVT-data.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::CreatePlayEffectSubmenuL( CEikMenuPane* aMenuPane,
+ TInt aCommandId,
+ TInt aDimCommandId )
+ {
+ TInt loadedIVTFileCount = iLoadedIVTFileArray.Count();
+ TBool dimmingNeeded = EFalse;
+
+ if ( loadedIVTFileCount )
+ {
+ // make all effect names (in all loaded files) visible in the submenu
+ CEikMenuPaneItem::SData data;
+ for ( TInt j = 0; j < loadedIVTFileCount; ++j)
+ {
+ if ( iLoadedIVTFileArray[j].iDataBuffer )
+ {
+ TInt effectCount = 0;
+ iHaptics->GetEffectCount( iLoadedIVTFileArray[j].iFileHandle, effectCount );
+ HBufC8* tempBuf8 = HBufC8::New( iHaptics->MaxEffectNameLength() );
+ TPtr8 effectName = tempBuf8->Des();
+ for ( TInt i = 0; i < effectCount; ++i )
+ {
+ // fetch effect name
+ iHaptics->GetEffectName( iLoadedIVTFileArray[j].iFileHandle, i, effectName );
+
+ data.iText.Copy( effectName );
+ data.iCommandId = aCommandId;
+ data.iCascadeId = 0;
+ data.iFlags = 0;
+ data.iExtraText = KNullDesC;
+
+ aMenuPane->AddMenuItemL( data );
+ dimmingNeeded = ETrue;
+ }
+ delete tempBuf8;
+ }
+ }
+ }
+ if ( dimmingNeeded )
+ {
+ // effects found in IVT-data, hide the "no effects" -item
+ aMenuPane->SetItemDimmed( aDimCommandId, ETrue );
+ }
+ }
+
+// ---------------------------------------------------------
+// Prints effect information got from getter functions
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PrintEffectInfo( TInt aIndex )
+ {
+ if ( iUseHandle && iShowEffectInfo )
+ {
+ TInt duration;
+ iHaptics->GetEffectDuration( iIVTFileHandle,
+ aIndex,
+ duration );
+
+ HBufC8* tempBuf8 = HBufC8::New( iHaptics->MaxEffectNameLength() );
+ TPtr8 effectName = tempBuf8->Des();
+
+ iHaptics->GetEffectName( iIVTFileHandle, aIndex, effectName );
+
+ TInt effectIndex;
+ iHaptics->GetEffectIndexFromName( iIVTFileHandle,
+ effectName,
+ effectIndex );
+
+ TInt type;
+ iHaptics->GetEffectType( iIVTFileHandle, aIndex, type );
+
+
+ HBufC* tempBuf16 = HBufC::New( iHaptics->MaxEffectNameLength() );
+ TPtr buf = tempBuf16->Des();
+
+ iAppView->InsertOutput( _L(" Effect name: "), EFalse );
+ buf.Copy( effectName );
+ iAppView->InsertOutput( buf, EFalse );
+
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( effectIndex );
+ iAppView->InsertOutput( _L(" Idx: "), EFalse );
+ iAppView->InsertOutput( buf );
+
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( duration );
+ iAppView->InsertOutput( _L(" Effect duration: "), EFalse );
+ iAppView->InsertOutput( buf );
+
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( type );
+ iAppView->InsertOutput( _L(" Effect type: "), EFalse );
+ iAppView->InsertOutput( buf );
+
+ if ( type == CHWRMHaptics::EHWRMHapticsTypeMagSweep )
+ {
+ CHWRMHaptics::THWRMHapticsMagSweepEffect def;
+ iHaptics->GetMagSweepEffectDefinition( iIVTFileHandle,
+ aIndex,
+ def );
+ iAppView->InsertOutput( _L(" MagSweep definition -> Duration:"), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iDuration );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" MagSweep definition -> Magnitude: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iMagnitude );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" MagSweep definition -> Style: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iStyle );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" MagSweep definition -> Attack time: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iAttackTime );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" MagSweep definition -> Attack level: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iAttackLevel );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" MagSweep definition -> Fade time: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iFadeTime );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" MagSweep definition -> Fade level: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iFadeLevel );
+ iAppView->InsertOutput( buf );
+ }
+ else if ( type == CHWRMHaptics::EHWRMHapticsTypePeriodic )
+ {
+ CHWRMHaptics::THWRMHapticsPeriodicEffect def;
+ iHaptics->GetPeriodicEffectDefinition( iIVTFileHandle,
+ aIndex,
+ def );
+ iAppView->InsertOutput( _L(" Periodic definition -> Duration: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iDuration );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Periodic definition -> Magnitude: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iMagnitude );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Periodic definition -> Period: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iPeriod );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Periodic definition -> Style: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iStyle );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Periodic definition -> Attack time: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iAttackTime );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Periodic definition -> Attack level: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iAttackLevel );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Periodic definition -> Fade time: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iFadeTime );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Periodic definition -> Attack level: "), EFalse );
+ buf.Delete( 0, buf.MaxLength() );
+ buf.AppendNum( def.iFadeLevel );
+ iAppView->InsertOutput( buf );
+ }
+ delete tempBuf8;
+ delete tempBuf16;
+ }
+ }
+
+// ---------------------------------------------------------
+// Prints the given status onto the screen.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::PrintStatusInfo(
+ MHWRMHapticsObserver::THWRMHapticsStatus aStatus ) const
+ {
+ iAppView->InsertOutput( _L("Received status: "), EFalse );
+
+ switch( aStatus )
+ {
+ case MHWRMHapticsObserver::EHWRMHapticsStatusAvailable:
+ {
+ iAppView->InsertOutput( _L("Available.") );
+ break;
+ }
+ case MHWRMHapticsObserver::EHWRMHapticsStatusReserved:
+ {
+ iAppView->InsertOutput( _L("Reserved.") );
+ break;
+ }
+ case MHWRMHapticsObserver::EHWRMHapticsStatusSuspended:
+ {
+ iAppView->InsertOutput( _L("Suspended.") );
+ break;
+ }
+ default:
+ {
+ iAppView->InsertOutput( _L("<unknown status>") );
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// Calls the getter methods for system constants
+// and prints out the results.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppUi::ConstGetters() const
+ {
+ _LIT( KNumFormat, "%d" );
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Infinite repeats: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->InfiniteRepeat() );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Infinite duration: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->InfiniteDuration() );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Max effect name length: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->MaxEffectNameLength() );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Max device name length: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->MaxDeviceNameLength() );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Max capability string length: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->MaxCapabilityStringLength() );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Max property string length: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->MaxPropertyStringLength() );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Max streaming sample size: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->MaxStreamingSampleSize() );
+ iAppView->InsertOutput( buf );
+ iAppView->InsertOutput( _L(" Default device priority: "), EFalse );
+ buf.Format( KNumFormat, iHaptics->DefaultDevicePriority() );
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+// Modifies an effect using the values set for iModifyEffect.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::ModifyEffect()
+ {
+ if ( !iEffectData->ModifiableEffectExists() )
+ {
+ return;
+ }
+
+ TInt err = KErrNone;
+ TInt effectHandle = iEffectData->ModifiableEffectHandle();
+
+ if ( iEffectData->ModifiableEffectIsMagSweep() )
+ {
+ // fill magsweep data
+ CHWRMHaptics::THWRMHapticsMagSweepEffect magsweep;
+ iEffectData->FillModifiableMagSweepData( magsweep );
+
+ // execute modification
+ if ( iSynchronous )
+ {
+ err = iHaptics->ModifyPlayingMagSweepEffect( effectHandle, magsweep );
+ }
+ else
+ {
+ TRequestStatus status;
+ iHaptics->ModifyPlayingMagSweepEffect( effectHandle, magsweep, status );
+ User::WaitForRequest( status );
+ err = status.Int();
+ }
+ }
+ else if ( iEffectData->ModifiableEffectIsPeriodic() )
+ {
+ // fill periodic data
+ CHWRMHaptics::THWRMHapticsPeriodicEffect periodic;
+ iEffectData->FillModifiablePeriodicData( periodic );
+
+ // execute modification
+ if ( iSynchronous )
+ {
+ err = iHaptics->ModifyPlayingPeriodicEffect( effectHandle, periodic );
+ }
+ else
+ {
+ TRequestStatus status;
+ iHaptics->ModifyPlayingPeriodicEffect( effectHandle, periodic, status );
+ User::WaitForRequest( status );
+ err = status.Int();
+ }
+ }
+
+ if ( err )
+ {
+ TBuf<8> errBuf;
+ errBuf.AppendNum( err );
+ iAppView->InsertOutput( _L("Modifying effect failed, err = "), EFalse );
+ iAppView->InsertOutput( errBuf );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("Modifying effect succeeded.") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Static callback method from a periodic timer used for
+// continuous effect modification (magnitude/period).
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestAppUi::ModifyPlayingEffect( TAny* aPtr )
+ {
+ CHapticsTestEffectDataHandler* effectData =
+ static_cast<CHapticsTestEffectDataHandler*>( aPtr );
+
+ // hundred modifications to get to KPi (up and down with magnitude)
+ TReal stepLengthRad = KPi/100 * effectData->ModifyCount();
+
+ // calculate absolute sin value
+ TReal sinValue = 0;
+ TInt errSin = Math::Sin( sinValue, stepLengthRad );
+ sinValue = Abs( sinValue );
+
+ // increase the amount of modifications done
+ effectData->SetModifyCount( effectData->ModifyCount() + 1 );
+
+ TInt err = KErrNone;
+ TInt effectHandle = effectData->ModifiableEffectHandle();
+
+ if ( effectData->ModifiableEffectIsMagSweep() )
+ {
+ // modify magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect magsweep;
+ effectData->FillModifiableMagSweepData( magsweep );
+
+ // new magnitude value according to sin value
+ magsweep.iMagnitude = KHWRMHapticsMaxMagnitude * sinValue;
+
+ // modify effect
+ err = effectData->Haptics()->ModifyPlayingMagSweepEffect(
+ effectHandle, magsweep );
+ }
+ else if ( effectData->ModifiableEffectIsPeriodic() )
+ {
+ // modify periodic effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect periodic;
+ effectData->FillModifiablePeriodicData( periodic );
+
+ // period getting smaller when magnitude getting higher
+ periodic.iPeriod = 20 + (1-sinValue)*200;
+
+ // modify effect
+ err = effectData->Haptics()->ModifyPlayingPeriodicEffect(
+ effectHandle, periodic );
+ }
+
+ if ( err )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("Modify failed!") );
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityDeviceCategory()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Device category: "), EFalse );
+ TInt retValue( CHWRMHaptics::EHWRMHapticsEmbedded );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsDeviceCategory, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ switch ( retValue )
+ {
+ case CHWRMHaptics::EHWRMHapticsVirtual:
+ buf.Append( _L("Virtual") );
+ break;
+ case CHWRMHaptics::EHWRMHapticsEmbedded:
+ buf.Append( _L("Embedded") );
+ break;
+ default:
+ buf.Append( _L("Unknown") );
+ break;
+ }
+ }
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityMaxNestedRepeats()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Max nested repeats: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsMaxNestedRepeats, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityNumActuators()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Number of actuators: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsNumActuators, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityActuatorType()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Actuator type: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsActuatorType, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ switch (retValue)
+ {
+ case CHWRMHaptics::EHWRMHapticsTypeERM:
+ buf.Append( _L("EHWRMHapticsTypeERM") );
+ break;
+ case CHWRMHaptics::EHWRMHapticsTypeLRA:
+ buf.Append( _L("EHWRMHapticsTypeLRA") );
+ break;
+ default:
+ buf.Append( _L("Unknown") );
+ break;
+ }
+ }
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityNumEffectSlots()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Number of effect slots: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsNumEffectSlots, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityNumEffectStyles()
+ {
+ TBuf<150> buf;
+ iAppView->InsertOutput( _L(" Effect styles: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsSupportedStyles, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ if ( retValue & CHWRMHaptics::EHWRMHapticsSupportSmooth )
+ {
+ buf.Append( _L(" EHWRMHapticsSupportSmooth") );
+ }
+
+ if ( retValue & CHWRMHaptics::EHWRMHapticsSupportStrong )
+ {
+ buf.Append( _L(" EHWRMHapticsSupportStrong") );
+ }
+
+ if ( retValue & CHWRMHaptics::EHWRMHapticsSupportSharp )
+ {
+ buf.Append( _L(" EHWRMHapticsSupportSharp") );
+ }
+ }
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityMinPeriod()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Minimum period for periodic effects: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsMinPeriod, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityMaxPeriod()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Maximum period for periodic effects: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsMaxPeriod, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityMaxEffectDuration()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Maximum effect duration: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsMaxEffectDuration, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilitySupportedEffects()
+ {
+ TBuf<150> buf;
+ iAppView->InsertOutput( _L(" Supported effect types: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsSupportedEffects, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ if ( retValue & CHWRMHaptics::EHWRMHapticsSupportPeriodic )
+ {
+ buf.Append( _L(" EHWRMHapticsSupportPeriodic") );
+ }
+
+ if ( retValue & CHWRMHaptics::EHWRMHapticsSupportMagSweep )
+ {
+ buf.Append( _L(" EHWRMHapticsSupportMagSweep") );
+ }
+
+ if ( retValue & CHWRMHaptics::EHWRMHapticsSupportTimeline )
+ {
+ buf.Append( _L(" EHWRMHapticsSupportTimeline") );
+ }
+
+ if ( retValue & CHWRMHaptics::EHWRMHapticsSupportStreaming )
+ {
+ buf.Append( _L(" EHWRMHapticsSupportStreaming") );
+ }
+ }
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityDeviceName()
+ {
+ TBuf<100> buf;
+ iAppView->InsertOutput( _L(" Device name: "), EFalse );
+ TBuf8<100> retValue;
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsDeviceName, retValue ) );
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ CnvUtfConverter::ConvertToUnicodeFromUtf8( buf, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityMaxEnvelopeTime()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Maximum envelop time: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsMaxEnvelopeTime, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityAPIVersionNumber()
+ {
+ TBuf<50> buf;
+ TInt retValue( 0 );
+ iAppView->InsertOutput( _L(" API version: "), EFalse );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsAPIVersionNumber, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetCapabilityMaxIVTSize()
+ {
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Maximum size of IVT file: "), EFalse );
+ TInt retValue( 0 );
+ TInt err( iHaptics->GetDeviceCapability(
+ CHWRMHaptics::EHWRMHapticsMaxEffectDataSize, retValue ) );
+
+ if ( err )
+ {
+ _LIT( KFailedFormat, "GetDeviceCapability failed (%d)!" );
+ buf.Format( KFailedFormat, err );
+ }
+ else
+ {
+ _LIT( KNumFormat, "%d" );
+ buf.Format( KNumFormat, retValue );
+ }
+
+ iAppView->InsertOutput( buf, ETrue );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyPriorityMin()
+ {
+ iAppView->InsertOutput( _L(" Setting priority to minimum"), ETrue );
+ TInt value(KHWRMHapticsMinDevicePriority);
+ TRAPD( err, iHaptics->SetDeviceProperty(CHWRMHaptics::EHWRMHapticsPriority, value));
+ if ( err )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyPriorityDefault()
+ {
+ iAppView->InsertOutput( _L(" Setting priority to default" ), ETrue );
+ TInt value( KHWRMHapticsMinDevicePriority );
+
+ TRAPD( err1, value = iHaptics->DefaultDevicePriority() );
+ if ( err1 )
+ {
+ CEikonEnv::Static()->InfoMsg( _L( "DefaultDevicePriority() failed!" ) );
+ return;
+ }
+
+ TRAPD( err2, iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority, value ) );
+ if ( err2 )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyPriorityMax()
+ {
+ iAppView->InsertOutput( _L(" Setting priority to maximum"), ETrue );
+ TInt value(KHWRMHapticsMaxDevicePriority);
+ TRAPD( err, iHaptics->SetDeviceProperty(CHWRMHaptics::EHWRMHapticsPriority, value));
+ if ( err )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetPropertyPriority()
+ {
+ _LIT( KNumFormat, "%d" );
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Device priority: "), EFalse );
+ TInt retValue(0);
+ TRAPD( err, iHaptics->GetDeviceProperty(CHWRMHaptics::EHWRMHapticsPriority, retValue));
+ if ( err )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("GetDeviceProperty failed!") );
+ }
+
+ buf.Format( KNumFormat, retValue );
+ iAppView->InsertOutput( buf, ETrue );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyDisableEffectsTrue()
+ {
+ iAppView->InsertOutput( _L(" Disabling effects" ), ETrue );
+ TBool value( ETrue );
+ TRAPD( err2, iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsDisableEffects, value ) );
+ if ( err2 )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyDisableEffectsFalse()
+ {
+ iAppView->InsertOutput( _L(" Enabling effects" ), ETrue );
+ TBool value( EFalse );
+ TRAPD( err2, iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsDisableEffects, value ) );
+ if ( err2 )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetPropertyDisableEffects()
+ {
+ iAppView->InsertOutput( _L(" Effects disabled: "), EFalse );
+ TInt retValue( EFalse );
+ TRAPD( err, iHaptics->GetDeviceProperty( CHWRMHaptics::EHWRMHapticsDisableEffects, retValue ) );
+ if ( err )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("GetDeviceProperty failed!") );
+ }
+ else
+ {
+ if ( retValue )
+ {
+ iAppView->InsertOutput( _L("TRUE"), ETrue );
+ }
+ else
+ {
+ iAppView->InsertOutput( _L("FALSE"), ETrue );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyStrengthMin()
+ {
+ iAppView->InsertOutput( _L(" Setting strength to mininum" ), ETrue );
+ TBool value( KHWRMHapticsMinStrength );
+ TRAPD( err2, iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, value ) );
+ if ( err2 )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyStrengthMiddle()
+ {
+ iAppView->InsertOutput( _L(" Setting strength to middle" ), ETrue );
+ TBool value( ( KHWRMHapticsMaxStrength - KHWRMHapticsMinStrength ) / 2 );
+ TRAPD( err2, iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, value ) );
+ if ( err2 )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::SetPropertyStrengthMax()
+ {
+ iAppView->InsertOutput( _L(" Setting strength to max" ), ETrue );
+ TBool value( KHWRMHapticsMaxStrength );
+ TRAPD( err2, iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, value ) );
+ if ( err2 )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("SetDeviceProperty failed!") );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::GetPropertyStrength()
+ {
+ _LIT( KNumFormat, "%d" );
+ TBuf<50> buf;
+ iAppView->InsertOutput( _L(" Strength level: "), EFalse );
+ TInt retValue(0);
+ TRAPD( err, iHaptics->GetDeviceProperty(CHWRMHaptics::EHWRMHapticsStrength, retValue));
+ if ( err )
+ {
+ CEikonEnv::Static()->InfoMsg( _L("GetDeviceProperty failed!") );
+ }
+
+ buf.Format( KNumFormat, retValue );
+ iAppView->InsertOutput( buf, ETrue );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Enables streaming mode.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::StartStreaming()
+ {
+ iCurrentSample = 0;
+ iEffectHandle = KErrNotFound;
+ TInt err = iHaptics->CreateStreamingEffect( iEffectHandle );
+
+ if ( err )
+ {
+ TBuf<16> errCode;
+ errCode.AppendNum( err );
+ iAppView->InsertOutput( _L("Create streaming effect failed! Err: "), EFalse );
+ iAppView->InsertOutput( errCode );
+ }
+ else
+ {
+ TBuf<16> handleBuf;
+ handleBuf.AppendNum( iEffectHandle );
+ iAppView->InsertOutput( _L("Streaming effect created successfully!") );
+ iAppView->InsertOutput( _L(" Effect handle: "), EFalse );
+ iAppView->InsertOutput( handleBuf );
+
+ iStreaming = ETrue;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// Plays one streaming sample from KStreamArray.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::PlayStreamingSample( TInt aSampleId )
+ {
+ RBuf8 sampleBuffer;
+ sampleBuffer.ReAlloc( sizeof( KStreamArray[aSampleId] ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( sampleBuffer.Ptr() );
+ memcpy( tmpPtr, KStreamArray[aSampleId], sizeof( KStreamArray[aSampleId] ) );
+ sampleBuffer.SetLength( sizeof( KStreamArray[aSampleId] ) );
+
+ iHaptics->PlayStreamingSample( iEffectHandle, sampleBuffer );
+
+ sampleBuffer.Close();
+ }
+
+
+// ---------------------------------------------------------------------------
+// Disables streaming mode.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAppUi::StopStreaming()
+ {
+ iStreaming = EFalse;
+
+ TInt err = iHaptics->DestroyStreamingEffect( iEffectHandle );
+ if ( err )
+ {
+ TBuf<16> errCode;
+ errCode.AppendNum( err );
+ iAppView->InsertOutput( _L("Destoy streaming effect failed! Err: "), EFalse );
+ iAppView->InsertOutput( errCode );
+ }
+ else
+ {
+ TBuf<16> handleBuf;
+ handleBuf.AppendNum( iEffectHandle );
+ iAppView->InsertOutput( _L("Streaming effect destroyed successfully!") );
+ }
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/src/hapticstestappview.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,202 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: AppView class implementation.
+*
+*/
+
+
+#include <coemain.h>
+#include <eikenv.h>
+#include <eikrted.h>
+#include <txtrich.h>
+#include <hapticstest.rsg>
+
+#include "hapticstestappview.h"
+
+const TInt KTestSmallerFontTwips = 65;
+
+// ---------------------------------------------------------
+// Standard construction sequence
+// ---------------------------------------------------------
+//
+CHapticsTestAppView* CHapticsTestAppView::NewL(const TRect& aRect)
+ {
+ CHapticsTestAppView* self = CHapticsTestAppView::NewLC(aRect);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------
+// Static constructor. Leaves the created instance onto the
+// cleanup stack.
+// ---------------------------------------------------------
+//
+CHapticsTestAppView* CHapticsTestAppView::NewLC(const TRect& aRect)
+ {
+ CHapticsTestAppView* self = new (ELeave) CHapticsTestAppView;
+ CleanupStack::PushL(self);
+ self->ConstructL(aRect);
+ return self;
+ }
+
+// ---------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------
+//
+CHapticsTestAppView::CHapticsTestAppView()
+ {
+ // no implementation required
+ }
+
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+//
+CHapticsTestAppView::~CHapticsTestAppView()
+ {
+ delete iParaFormat;
+ iParaFormat = NULL;
+
+ delete iCharFormat;
+ iCharFormat = NULL;
+
+ delete iOutputWindow;
+ iOutputWindow = NULL;
+
+ delete iRichText;
+ iRichText = NULL;
+ }
+
+// ---------------------------------------------------------
+// Construct the view using a rich text editor.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppView::ConstructL(const TRect& aRect)
+ {
+ // Create a window for this application view
+ CreateWindowL();
+
+ // get normal font
+ const CFont* font = CEikonEnv::Static()->NormalFont();
+ TFontSpec fontspec = font->FontSpecInTwips();
+
+ TCharFormat defaultCharFormat( fontspec.iTypeface.iName,
+ fontspec.iHeight - KTestSmallerFontTwips );
+ TCharFormatMask defaultCharFormatMask;
+ defaultCharFormatMask.SetAttrib( EAttFontTypeface );
+ defaultCharFormatMask.SetAttrib( EAttFontHeight );
+
+ // paragraph and char format layers
+ iParaFormat = CParaFormatLayer::NewL();
+ iCharFormat = CCharFormatLayer::NewL( defaultCharFormat,
+ defaultCharFormatMask );
+
+ iRichText = CRichText::NewL( iParaFormat, iCharFormat );
+
+ //Create bordered edit windows.
+ iOutputWindow = new (ELeave) CEikRichTextEditor( TGulBorder( TGulBorder::EShallowRaised ) );
+ iOutputWindow->SetContainerWindowL( *this );
+
+ // Create scrollbar
+ iOutputWindow->CreateScrollBarFrameL();
+ iOutputWindow->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+ iOutputWindow->ConstructL( this, 0, 0,
+ EEikEdwinOwnsWindow|EEikEdwinInclusiveSizeFixed|
+ EEikEdwinKeepDocument|EEikEdwinUserSuppliedText|
+ EEikEdwinLineCursor|EEikEdwinAlwaysShowSelection );
+
+ TRect outputRect( Rect() );
+ TInt outputWidthOffset = iOutputWindow->ScrollBarFrame()->ScrollBarBreadth( CEikScrollBar::EVertical );
+ outputRect.iBr.iX -= outputWidthOffset;
+
+ iOutputWindow->SetDocumentContentL( *iRichText, CEikEdwin::EUseText );
+ iOutputWindow->SetRect( outputRect );
+ iOutputWindow->ActivateL();
+ iOutputWindow->SetFocus( ETrue );
+
+ // Set the windows size
+ SetRect( aRect );
+
+ // Activate the window, which makes it ready to be drawn
+ ActivateL();
+ }
+
+// ---------------------------------------------------------
+// Insert the given text to the end of the outputted text.
+// Adds line break to the end of the text.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppView::InsertOutput( const TDesC& aOutputLine,
+ TBool aLineBreak ) const
+ {
+ TRAPD( err, iRichText->InsertL( iOutputWindow->TextLength(),
+ aOutputLine ) );
+
+ // insert line break if requested
+ if ( aLineBreak )
+ {
+ TRAP( err, iRichText->InsertL( iOutputWindow->TextLength(),
+ (TChar)CEditableText::ELineBreak ) );
+ }
+
+ TRAP( err, iOutputWindow->ForceScrollBarUpdateL() );
+ TRAP( err, iOutputWindow->SetCursorPosL( iOutputWindow->TextLength(),
+ EFalse) );
+ }
+
+// ---------------------------------------------------------
+// Clears the output view.
+// ---------------------------------------------------------
+//
+void CHapticsTestAppView::ClearOutput() const
+ {
+ iRichText->Reset();
+ TRAPD( err, iOutputWindow->HandleTextChangedL());
+ err = err; // just to escape warning message for ARM
+ iOutputWindow->SetCursorPosL( 0, EFalse );
+ }
+
+// ---------------------------------------------------------
+// Draw this application's view to the screen
+// ---------------------------------------------------------
+//
+void CHapticsTestAppView::Draw( const TRect& /*aRect*/ ) const
+ {
+ // Get the standard graphics context
+ CWindowGc& gc = SystemGc();
+
+ // Gets the control's extent
+ TRect rect = Rect();
+
+ // Clears the screen
+ gc.Clear( rect );
+ }
+
+// ---------------------------------------------------------
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CHapticsTestAppView::SizeChanged()
+ {
+ // decrease the width of the scrollbar from the width of the editor rect
+ TInt outputWidthOffset = iOutputWindow->ScrollBarFrame()->ScrollBarBreadth( CEikScrollBar::EVertical );
+ TRect outputRect( Rect() );
+ outputRect.iBr.iX -= outputWidthOffset;
+ iOutputWindow->SetRect( outputRect );
+ iOutputWindow->SetFocus( ETrue );
+ }
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/src/hapticstestasyncplaysender.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,113 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Implementation for asynchronous play commands sender object.
+*
+*/
+
+
+#include "hapticstestappview.h"
+#include "hapticstestappui.h"
+#include "hapticstestasyncplaysender.h"
+#include "hapticstesteffectdatahandler.h"
+
+// ---------------------------------------------------------------------------
+// Simple constructor.
+// ---------------------------------------------------------------------------
+//
+CHapticsTestAsyncPlaySender::CHapticsTestAsyncPlaySender(
+ CHapticsTestAppUi* aUi )
+ : CActive( EPriorityStandard ), iUi( aUi )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CHapticsTestAsyncPlaySender::~CHapticsTestAsyncPlaySender()
+ {
+ Cancel();
+ }
+
+// ---------------------------------------------------------------------------
+// Method for requesting the playing of an effect repeatedly.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAsyncPlaySender::PlayRepeat( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TUint8 aRepeat,
+ TInt& aEffectHandle )
+ {
+ iIndex = aEffectIndex;
+ aHaptics->PlayEffectRepeat( aFileHandle,
+ aEffectIndex,
+ aRepeat,
+ aEffectHandle,
+ iStatus );
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// Method for requesting the playing of an effect.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAsyncPlaySender::Play( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TInt& aEffectHandle )
+ {
+ iIndex = aEffectIndex;
+ aHaptics->PlayEffect( aFileHandle,
+ aEffectIndex,
+ aEffectHandle,
+ iStatus );
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// This active object's RunL.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAsyncPlaySender::RunL()
+ {
+ TInt status = iStatus.Int();
+ iUi->PrintPlayEffectStatus( status );
+ iUi->GetCurrentEffectState();
+ if ( !status )
+ {
+ iUi->iEffectData->AddEffectInfo(
+ iUi->iEffectHandle, iUi->iIVTFileHandle, iIndex );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Dummy DoCancel(). Required due to inheritance from CActive.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestAsyncPlaySender::DoCancel()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Dummy RunError(). Required due to inheritance from CActive.
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestAsyncPlaySender::RunError( TInt /* aError */ )
+ {
+ return KErrNone;
+ }
+
+// end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/src/hapticstestdocument.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Document class implementation.
+*
+*/
+
+
+#include "hapticstestappui.h"
+#include "hapticstestdocument.h"
+
+// ---------------------------------------------------------
+// Standard Symbian OS construction sequence
+// ---------------------------------------------------------
+//
+CHapticsTestDocument* CHapticsTestDocument::NewL(CEikApplication& aApp)
+ {
+ CHapticsTestDocument* self = NewLC(aApp);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------
+// Standard Symbian OS construction sequence
+// ---------------------------------------------------------
+//
+CHapticsTestDocument* CHapticsTestDocument::NewLC(CEikApplication& aApp)
+ {
+ CHapticsTestDocument* self = new (ELeave) CHapticsTestDocument(aApp);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------
+// Second phase construction.
+// ---------------------------------------------------------
+//
+void CHapticsTestDocument::ConstructL()
+ {
+ // no implementation required
+ }
+
+// ---------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------
+//
+CHapticsTestDocument::CHapticsTestDocument(CEikApplication& aApp)
+ : CAknDocument(aApp)
+ {
+ // no implementation required
+ }
+
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+//
+CHapticsTestDocument::~CHapticsTestDocument()
+ {
+ // no implementation required
+ }
+
+// ---------------------------------------------------------
+// Creates AppUi component.
+// ---------------------------------------------------------
+//
+CEikAppUi* CHapticsTestDocument::CreateAppUiL()
+ {
+ // Create the application user interface, and return a pointer to it,
+ // the framework takes ownership of this object
+ CEikAppUi* appUi = new (ELeave) CHapticsTestAppUi;
+ return appUi;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/examples/hapticstestapp/src/hapticstesteffectdatahandler.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,904 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Active object listening waiting for async haptics completion.
+*
+*/
+
+
+#include <eikmenup.h>
+#include <eikon.hrh>
+
+#include "hapticstest.hrh"
+#include "hapticstesteffectdatahandler.h"
+
+
+_LIT( KManualEffectName, "manual" );
+
+const TInt KEffectModificationInterval = 50000; // microseconds
+const TInt KMaxEffectHistorySize = 25;
+const TInt KDefaultNonInfiniteDuration = 1000; // milliseconds
+
+// default values for manual effects
+const TInt KDefaultEffectMagnitude = KHWRMHapticsMaxMagnitude;
+const TInt KDefaultEffectAttackLevel = KHWRMHapticsMaxMagnitude * 0.5;
+const TInt KDefaultEffectFadeLevel = KHWRMHapticsMaxMagnitude * 0.5;
+const TInt KDefaultEffectAttackTime = 200; // milliseconds
+const TInt KDefaultEffectFadeTime = 200; // milliseconds
+const TInt KDefaultEffectPeriod = 300; // milliseconds
+const CHWRMHaptics::THWRMHapticsEffectStyles KDefaultEffectStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+
+
+// ---------------------------------------------------------------------------
+// Symbian two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CHapticsTestEffectDataHandler* CHapticsTestEffectDataHandler::NewL()
+ {
+ CHapticsTestEffectDataHandler* self =
+ CHapticsTestEffectDataHandler::NewLC();
+
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Symbian two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CHapticsTestEffectDataHandler* CHapticsTestEffectDataHandler::NewLC()
+ {
+ CHapticsTestEffectDataHandler* self =
+ new ( ELeave ) CHapticsTestEffectDataHandler();
+ CleanupStack::PushL( self );
+
+ self->ConstructL();
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CHapticsTestEffectDataHandler::~CHapticsTestEffectDataHandler()
+ {
+ ResetModifiableEffectTimer();
+
+ if ( iModifyEffect )
+ {
+ delete iModifyEffect;
+ iModifyEffect = NULL;
+ }
+
+ iPlayedEffectArray.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// Adds effect data to effect history array.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::AddEffectInfo( TInt aEffectHandle,
+ TInt aFileHandle,
+ TInt aIndex )
+ {
+ TPlayedEffect newEffect;
+ newEffect.iEffectHandle = aEffectHandle;
+ newEffect.iFileHandle = aFileHandle;
+ newEffect.iEffectIndex = aIndex;
+
+ // add item to the beginning of the array, ignore possible error
+ iPlayedEffectArray.Insert( newEffect, 0 );
+
+ // if there are too many items, remove the last one
+ TInt count = iPlayedEffectArray.Count();
+ if ( count > KMaxEffectHistorySize )
+ {
+ iPlayedEffectArray.Remove( count - 1 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Deletest all effect info items from the list that have
+// the given filehandle in their data.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DeleteEffectInfo( TInt aFileHandle )
+ {
+ for ( TInt i = iPlayedEffectArray.Count() - 1; i >= 0 ; --i )
+ {
+ if ( iPlayedEffectArray[i].iFileHandle == aFileHandle )
+ {
+ iPlayedEffectArray.Remove( i );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the amount of effect data stored in the history data array.
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestEffectDataHandler::Count() const
+ {
+ return iPlayedEffectArray.Count();
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the effect handle of the given effect data item.
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestEffectDataHandler::EffectHandle( TInt aIndex ) const
+ {
+ return iPlayedEffectArray[aIndex].iEffectHandle;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the file handle of the given effect data item.
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestEffectDataHandler::FileHandle( TInt aIndex ) const
+ {
+ return iPlayedEffectArray[aIndex].iFileHandle;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the effect index of the given effect data item.
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestEffectDataHandler::EffectIndex( TInt aIndex ) const
+ {
+ return iPlayedEffectArray[aIndex].iEffectIndex;
+ }
+
+// ---------------------------------------------------------------------------
+// Resets the modifiable effect data with the data received in the
+// given magsweep effect.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::ResetModifiableMagSweepEffectL(
+ const CHWRMHaptics::THWRMHapticsMagSweepEffect& aMagSweep,
+ TInt aEffectHandle, CHWRMHaptics* aHaptics )
+ {
+ // reset effect data
+ if ( iModifyEffect )
+ {
+ delete iModifyEffect;
+ iModifyEffect = NULL;
+ }
+
+ // create new effect data
+ iModifyEffect = new (ELeave) TModifyEffect();
+ iModifyEffect->iHaptics = aHaptics;
+ iModifyEffect->iEffectType = CHWRMHaptics::EHWRMHapticsTypeMagSweep;
+ iModifyEffect->iEffectHandle = aEffectHandle;
+ iModifyEffect->iModifyCount = 0;
+
+ // store default effect values
+ iModifyEffect->iDuration = aMagSweep.iDuration;
+ iModifyEffect->iMagnitude = aMagSweep.iMagnitude;
+ iModifyEffect->iStyle = aMagSweep.iStyle;
+ iModifyEffect->iAttackLevel = aMagSweep.iAttackLevel;
+ iModifyEffect->iFadeLevel = aMagSweep.iFadeLevel;
+ iModifyEffect->iAttackTime = aMagSweep.iAttackTime;
+ iModifyEffect->iFadeTime = aMagSweep.iFadeTime;
+
+ // no period for magsweep, use default value
+ iModifyEffect->iPeriod = KDefaultEffectPeriod;
+ }
+
+// ---------------------------------------------------------------------------
+// Resets the modifiable effect data with the data received in the
+// given periodic effect.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::ResetModifiablePeriodicEffectL(
+ const CHWRMHaptics::THWRMHapticsPeriodicEffect& aPeriodic,
+ TInt aEffectHandle, CHWRMHaptics* aHaptics )
+ {
+ // reset effect data
+ if ( iModifyEffect )
+ {
+ delete iModifyEffect;
+ iModifyEffect = NULL;
+ }
+
+ // create new effect data
+ iModifyEffect = new (ELeave) TModifyEffect();
+ iModifyEffect->iHaptics = aHaptics;
+ iModifyEffect->iEffectType = CHWRMHaptics::EHWRMHapticsTypePeriodic;
+ iModifyEffect->iEffectHandle = aEffectHandle;
+ iModifyEffect->iModifyCount = 0;
+
+ // store default effect values
+ iModifyEffect->iDuration = aPeriodic.iDuration;
+ iModifyEffect->iMagnitude = aPeriodic.iMagnitude;
+ iModifyEffect->iStyle = aPeriodic.iStyle;
+ iModifyEffect->iAttackLevel = aPeriodic.iAttackLevel;
+ iModifyEffect->iFadeLevel = aPeriodic.iFadeLevel;
+ iModifyEffect->iAttackTime = aPeriodic.iAttackTime;
+ iModifyEffect->iFadeTime = aPeriodic.iFadeTime;
+ iModifyEffect->iPeriod = aPeriodic.iPeriod;
+ }
+
+// ---------------------------------------------------------------------------
+// Starts the timer for constantly modifying an effect.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::StartModifiableEffectTimerL( TInt (*aFunction)(TAny* aPtr) )
+ {
+ ResetModifiableEffectTimer();
+
+ // create and start periodic timer
+ iModifyTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+ iModifyTimer->Start( KEffectModificationInterval,
+ KEffectModificationInterval,
+ TCallBack( aFunction, this ) );
+ }
+
+// ---------------------------------------------------------------------------
+// Cancels and deletes the timer.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::ResetModifiableEffectTimer()
+ {
+ // reset timer
+ if ( iModifyTimer )
+ {
+ iModifyTimer->Cancel();
+ delete iModifyTimer;
+ iModifyTimer = NULL;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Returns whether or not a modifiable effect exists.
+// ---------------------------------------------------------------------------
+//
+TBool CHapticsTestEffectDataHandler::ModifiableEffectExists() const
+ {
+ return iModifyEffect ? ETrue : EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns whether or not the currently stored effect is a magsweep effect.
+// ---------------------------------------------------------------------------
+//
+TBool CHapticsTestEffectDataHandler::ModifiableEffectIsMagSweep() const
+ {
+ return ( iModifyEffect->iEffectType == CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ }
+
+// ---------------------------------------------------------------------------
+// Returns whether or not the currently stored effect is a periodic effect.
+// ---------------------------------------------------------------------------
+//
+TBool CHapticsTestEffectDataHandler::ModifiableEffectIsPeriodic() const
+ {
+ return ( iModifyEffect->iEffectType == CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the effect handle of the modifiable effect.
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestEffectDataHandler::ModifiableEffectHandle() const
+ {
+ return iModifyEffect->iEffectHandle;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the amount of times the current modifiable effect
+// has been modified already.
+// ---------------------------------------------------------------------------
+//
+TInt CHapticsTestEffectDataHandler::ModifyCount() const
+ {
+ return iModifyEffect->iModifyCount;
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the pointer to the haptics client instance, which
+// has been set to the effect modification data.
+// ---------------------------------------------------------------------------
+//
+CHWRMHaptics* CHapticsTestEffectDataHandler::Haptics() const
+ {
+ return iModifyEffect->iHaptics;
+ }
+
+// ---------------------------------------------------------------------------
+// Fills in default magsweep effect data into the given structure.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::FillDefaultMagSweepData(
+ CHWRMHaptics::THWRMHapticsMagSweepEffect& aMagSweep,
+ TBool aInfinite, TBool aAutoModifiable,
+ CHWRMHaptics* aHaptics ) const
+ {
+ if ( aInfinite )
+ {
+ aMagSweep.iDuration = aHaptics->InfiniteDuration();
+ }
+ else
+ {
+ aMagSweep.iDuration = KDefaultNonInfiniteDuration;
+ }
+
+ if ( aAutoModifiable )
+ {
+ // start modifiable effect from minimum magnitude
+ aMagSweep.iMagnitude = KHWRMHapticsMinMagnitude;
+ aMagSweep.iAttackLevel = KHWRMHapticsMinMagnitude;
+ aMagSweep.iFadeLevel = KHWRMHapticsMinMagnitude;
+ }
+ else
+ {
+ // non-modifiable effect
+ aMagSweep.iMagnitude = KDefaultEffectMagnitude;
+ aMagSweep.iAttackLevel = KDefaultEffectAttackLevel;
+ aMagSweep.iFadeLevel = KDefaultEffectFadeLevel;
+ }
+
+ aMagSweep.iStyle = KDefaultEffectStyle;
+ aMagSweep.iAttackTime = KDefaultEffectAttackTime;
+ aMagSweep.iFadeTime = KDefaultEffectFadeTime;
+ }
+
+// ---------------------------------------------------------------------------
+// Fills in default periodic effect data into the given structure.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::FillDefaultPeriodicData(
+ CHWRMHaptics::THWRMHapticsPeriodicEffect& aPeriodic,
+ TBool aInfinite, TBool /*aAutoModifiable*/,
+ CHWRMHaptics* aHaptics ) const
+ {
+ if ( aInfinite )
+ {
+ aPeriodic.iDuration = aHaptics->InfiniteDuration();
+ }
+ else
+ {
+ aPeriodic.iDuration = KDefaultNonInfiniteDuration;
+ }
+
+ aPeriodic.iMagnitude = KDefaultEffectMagnitude;
+ aPeriodic.iAttackLevel = KDefaultEffectAttackLevel;
+ aPeriodic.iFadeLevel = KDefaultEffectFadeLevel;
+
+ aPeriodic.iPeriod = KDefaultEffectPeriod;
+ aPeriodic.iStyle = KDefaultEffectStyle;
+ aPeriodic.iAttackTime = KDefaultEffectAttackTime;
+ aPeriodic.iFadeTime = KDefaultEffectFadeTime;
+ }
+
+// ---------------------------------------------------------------------------
+// Fills in the modifiable effect data into the given magsweep structure.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::FillModifiableMagSweepData(
+ CHWRMHaptics::THWRMHapticsMagSweepEffect& aMagSweep ) const
+ {
+ aMagSweep.iDuration = iModifyEffect->iDuration;
+ aMagSweep.iStyle = iModifyEffect->iStyle;
+ aMagSweep.iAttackTime = iModifyEffect->iAttackTime;
+ aMagSweep.iFadeTime = iModifyEffect->iFadeTime;
+ aMagSweep.iMagnitude = iModifyEffect->iMagnitude;
+ aMagSweep.iAttackLevel = iModifyEffect->iAttackLevel;
+ aMagSweep.iFadeLevel = iModifyEffect->iFadeLevel;
+ }
+
+// ---------------------------------------------------------------------------
+// Fills in the modifiable effect data into the given periodic structure.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::FillModifiablePeriodicData(
+ CHWRMHaptics::THWRMHapticsPeriodicEffect& aPeriodic ) const
+ {
+ aPeriodic.iDuration = iModifyEffect->iDuration;
+ aPeriodic.iStyle = iModifyEffect->iStyle;
+ aPeriodic.iAttackTime = iModifyEffect->iAttackTime;
+ aPeriodic.iFadeTime = iModifyEffect->iFadeTime;
+ aPeriodic.iMagnitude = iModifyEffect->iMagnitude;
+ aPeriodic.iAttackLevel = iModifyEffect->iAttackLevel;
+ aPeriodic.iFadeLevel = iModifyEffect->iFadeLevel;
+ aPeriodic.iPeriod = iModifyEffect->iPeriod;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's modify count.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetModifyCount( TInt aModifyCount )
+ {
+ iModifyEffect->iModifyCount = aModifyCount;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's duration value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetDuration( TInt aDuration )
+ {
+ iModifyEffect->iDuration = aDuration;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's magnitude value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetMagnitude( TInt aMagnitude )
+ {
+ iModifyEffect->iMagnitude = aMagnitude;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's style value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetStyle(
+ CHWRMHaptics::THWRMHapticsEffectStyles aStyle )
+ {
+ iModifyEffect->iStyle = aStyle;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's attack level value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetAttackLevel( TInt aAttackLevel )
+ {
+ iModifyEffect->iAttackLevel = aAttackLevel;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's fade level value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetFadeLevel( TInt aFadeLevel )
+ {
+ iModifyEffect->iFadeLevel = aFadeLevel;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's attack time value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetAttackTime( TInt aAttackTime )
+ {
+ iModifyEffect->iAttackTime = aAttackTime;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's fade time value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetFadeTime( TInt aFadeTime )
+ {
+ iModifyEffect->iFadeTime = aFadeTime;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the modifiable effect's period value.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::SetPeriod( TInt aPeriod )
+ {
+ iModifyEffect->iPeriod = aPeriod;
+ }
+
+// ---------------------------------------------------------------------------
+// Creates all submenu items for a change effect state submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitChangeEffectStateSubmenuL(
+ CEikMenuPane* aMenuPane,
+ TInt aCommandId,
+ CHWRMHaptics* aHaptics )
+ {
+ // get effect count
+ TInt effectCount = iPlayedEffectArray.Count();
+
+ // fill effect history data to submenu, if any data available
+ if ( effectCount )
+ {
+ // there is data, hide "none found"
+ aMenuPane->SetItemDimmed( EHapticsTestChangeStateNoneFound, ETrue );
+
+ // make played effects visible in the submenu
+ CEikMenuPaneItem::SData data;
+ for ( TInt i = 0; i < effectCount; ++i )
+ {
+ // buffer for effect name
+ HBufC8* effectName = HBufC8::NewL( aHaptics->MaxEffectNameLength() );
+ TPtr8 namePtr = effectName->Des();
+
+ // effect name
+ if ( iPlayedEffectArray[i].iFileHandle > 0 &&
+ iPlayedEffectArray[i].iEffectIndex > 0 )
+ {
+ aHaptics->GetEffectName( iPlayedEffectArray[i].iFileHandle,
+ iPlayedEffectArray[i].iEffectIndex,
+ namePtr );
+ }
+ else
+ {
+ namePtr.Append( KManualEffectName );
+ }
+
+ // insert data to submenu item
+ data.iText.Copy( *effectName );
+ data.iCommandId = aCommandId;
+ data.iCascadeId = 0;
+ data.iFlags = 0;
+ data.iExtraText = KNullDesC;
+
+ delete effectName;
+
+ aMenuPane->AddMenuItemL( data );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the duration, which is currently in use
+// in the duration modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitDurationSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct duration value
+ if ( iModifyEffect->iDuration == KEffectDuration1 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectDuration1,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iDuration == KEffectDuration5 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectDuration5,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iDuration == KEffectDuration10 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectDuration10,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iDuration == KEffectDuration30 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectDuration30,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iDuration == KEffectDuration60 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectDuration60,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the magnitude, which is currently in use
+// in the magnitude modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitMagnitudeSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct magnitude value
+ if ( iModifyEffect->iMagnitude == KHWRMHapticsMinMagnitude )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectMagnitudeMin,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iMagnitude == KEffectMagnitude25 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectMagnitude25,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iMagnitude == KEffectMagnitude50 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectMagnitude50,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iMagnitude == KEffectMagnitude75 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectMagnitude75,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iMagnitude == KHWRMHapticsMaxMagnitude )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectMagnitudeMax,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the style, which is currently in use
+// in the style modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitStyleSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct style value
+ if ( iModifyEffect->iStyle == CHWRMHaptics::EHWRMHapticsStyleSmooth )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectStyleSmooth,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iStyle == CHWRMHaptics::EHWRMHapticsStyleStrong )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectStyleStrong,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iStyle == CHWRMHaptics::EHWRMHapticsStyleSharp )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectStyleSharp,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the attack level, which is currently in use
+// in the attack level modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitAttackLevelSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct attack level value
+ if ( iModifyEffect->iAttackLevel == KHWRMHapticsMinMagnitude )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackMin,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackLevel == KEffectMagnitude25 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttack25,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackLevel == KEffectMagnitude50 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttack50,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackLevel == KEffectMagnitude75 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttack75,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackLevel == KHWRMHapticsMaxMagnitude )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackMax,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the fade level, which is currently in use
+// in the fade level modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitFadeLevelSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct fade level value
+ if ( iModifyEffect->iFadeLevel == KHWRMHapticsMinMagnitude )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeMin,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeLevel == KEffectMagnitude25 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFade25,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeLevel == KEffectMagnitude50 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFade50,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeLevel == KEffectMagnitude75 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFade75,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeLevel == KHWRMHapticsMaxMagnitude )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeMax,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the attack time, which is currently in use
+// in the attack time modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitAttackTimeSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct attack time value
+ if ( iModifyEffect->iAttackTime == KEffectAttackTime02 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackTime02,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackTime == KEffectAttackTime1 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackTime1,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackTime == KEffectAttackTime5 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackTime5,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackTime == KEffectAttackTime10 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackTime10,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackTime == KEffectAttackTime30 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackTime30,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iAttackTime == KEffectAttackTime60 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectAttackTime60,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the fade time, which is currently in use
+// in the fade time modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitFadeTimeSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct fade time value
+ if ( iModifyEffect->iFadeTime == KEffectFadeTime02 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeTime02,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeTime == KEffectFadeTime1 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeTime1,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeTime == KEffectFadeTime5 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeTime5,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeTime == KEffectFadeTime10 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeTime10,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeTime == KEffectFadeTime30 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeTime30,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iFadeTime == KEffectFadeTime60 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectFadeTime60,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// Creates the checkmark to the period, which is currently in use
+// in the period modification submenu.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::DynInitPeriodSubmenu(
+ CEikMenuPane* aMenuPane ) const
+ {
+ // set check mark to correct period value
+ if ( iModifyEffect->iPeriod == KEffectPeriod50 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectPeriod50,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iPeriod == KEffectPeriod100 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectPeriod100,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iPeriod == KEffectPeriod300 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectPeriod300,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iPeriod == KEffectPeriod600 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectPeriod600,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iPeriod == KEffectPeriod1000 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectPeriod1000,
+ EEikMenuItemSymbolOn );
+ }
+ else if ( iModifyEffect->iPeriod == KEffectPeriod3000 )
+ {
+ aMenuPane->SetItemButtonState(
+ EHapticsTestModifyEffectPeriod3000,
+ EEikMenuItemSymbolOn );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CHapticsTestEffectDataHandler::CHapticsTestEffectDataHandler()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// Second phase construction.
+// ---------------------------------------------------------------------------
+//
+void CHapticsTestEffectDataHandler::ConstructL()
+ {
+ }
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/bwins/mt_hapticsclientu.def Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,2 @@
+EXPORTS
+ ?CreateTestSuiteL@@YAPAVMEUnitTest@@XZ @ 1 NONAME ; class MEUnitTest * __cdecl CreateTestSuiteL(void)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/data/hwrmhapticsuid.ini Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,8 @@
+// This file contains VIDs/SIDs which are allowed to use haptics license key auto setting.
+// If SID is found from this list then related VID is omitted.
+// For example, assuming SID 0x12345678 is allowed, add row (without slash signs):
+//+ SID 0x12345678
+
++ VID 0x101FB657 //Nokia VID
++ SID 0x10003B20 //Window server
++ VID 0x70000013 //EUnit
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/eabi/mt_hapticsclientu.def Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+ _Z16CreateTestSuiteLv @ 1 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,27 @@
+/*
+* 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 the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+PRJ_PLATFORMS
+ARMV5 WINSCW
+
+PRJ_EXPORTS
+../data/hwrmhapticsuid.ini /epoc32/release/winscw/udeb/z/private/200184b9/hwrmhapticsuid.ini
+
+PRJ_MMPFILES
+MT_HapticsClient.mmp
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/group/mt_hapticsclient.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET MT_HapticsClient.dll
+TARGETTYPE dll
+UID 0x1000af5a 0x01700000
+
+CAPABILITY ALL -TCB -DRM
+VENDORID VID_DEFAULT
+
+
+// Sources required by the test suite
+SOURCEPATH ../MT_HapticsClient
+SOURCE mt_hapticsclient.cpp
+SOURCE MT_HapticsClient_DllMain.cpp
+
+USERINCLUDE ../MT_HapticsClient
+
+OS_LAYER_LIBC_SYSTEMINCLUDE
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY EUnit.lib
+LIBRARY EUnitUtil.lib
+LIBRARY euser.lib
+LIBRARY hwrmhapticsclient.lib
+
+SMPSAFE
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/group/mt_hapticslicense.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET MT_HapticsLicense.dll
+TARGETTYPE dll
+UID 0x1000af5a 0x01700000
+
+CAPABILITY ALL -TCB -DRM
+VENDORID VID_DEFAULT
+
+
+// Sources required by the test suite
+
+SOURCEPATH ../MT_HapticsLicenseKey
+SOURCE mt_hapticslicensekey.cpp
+SOURCE MT_HapticsLicenseKey_DllMain.cpp
+
+USERINCLUDE ../MT_HapticsLicenseKey
+
+OS_LAYER_LIBC_SYSTEMINCLUDE
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY EUnit.lib
+LIBRARY EUnitUtil.lib
+LIBRARY euser.lib
+LIBRARY hwrmhapticsclient.lib
+LIBRARY hwrmhapticslicense.lib
+
+SMPSAFE
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/mt_hapticsclient/mt_hapticsclient.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,5034 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "MT_HapticsClient.h"
+#include <Digia/EUnit/EUnitMacros.h>
+#include <Digia/EUnit/EUnitDecorators.h>
+#include <limits.h>
+
+//
+// EUnit test log: \epoc32\winscw\c\shared\EUnit\Logs\EUnit_log.xml
+//
+
+// ---------------------------------------------------------
+// Couple of static TUint8 arrays containing bytes for simple
+// timeline and magsweep effects (that are used in PlayEffect
+// and PlayEffectRepeat method related tests below).
+// These are obtained using VibeTonz Studio's export to C-file
+// functionality.
+// ---------------------------------------------------------
+static const TUint8 Timeline4HapticsMT_ivt[] =
+{
+ 0x01, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf1, 0xe0, 0x01, 0xe2,
+ 0x00, 0x00, 0xff, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f,
+ 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x12, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x65, 0x00,
+ 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x67, 0x00,
+ 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00
+};
+
+static const TUint8 Magsweep4HapticsMT_ivt[] =
+{
+ 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x81, 0x00, 0x00, 0x4d, 0x00, 0x61, 0x00,
+ 0x67, 0x00, 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00
+};
+
+static const TUint8 Periodic4HapticsMT_ivt[] =
+{
+ 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x81, 0x00, 0x00, 0x50, 0x00, 0x65, 0x00,
+ 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00
+};
+
+// | Object name | Type | Duration | Magnitude | Period |
+//--------------------------------------------------------------
+// 1. | Timeline1 | Timeline | 3915 | | |
+// 2. | Timeline2 | Timeline | 5806 | | |
+// 3. | Periodic1 | Periodic | 1000 | 7480 | 100 |
+// 4. | Periodic2 | Periodic | 2000 | 7480 | 100 |
+// 5. | MagSweep1 | MagSweep | 3000 | 7480 | |
+// 6. | MagSweep2 | MagSweep | 4000 | 7480 | |
+// -------------------------------------------------------------
+static const TUint8 EffectSetMT_ivt[] =
+{
+ 0x01, 0x00, 0x06, 0x00, 0x66, 0x00, 0x84, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x2a, 0x00,
+ 0x3a, 0x00, 0x4a, 0x00, 0xf1, 0xe0, 0x02, 0xe2, 0x00, 0x00, 0xf1, 0xe0, 0x04, 0xe2, 0x03, 0x93,
+ 0xff, 0xf1, 0xe0, 0x03, 0xe2, 0x00, 0x00, 0xf1, 0xe0, 0x05, 0xe2, 0x07, 0x0e, 0xff, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x81, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7d, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x01, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbb, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x81, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfa, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x14, 0x00, 0x28, 0x00, 0x3c, 0x00, 0x50, 0x00, 0x64, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6d, 0x00,
+ 0x65, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x31, 0x00, 0x00, 0x00, 0x54, 0x00,
+ 0x69, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x32, 0x00,
+ 0x00, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00,
+ 0x63, 0x00, 0x31, 0x00, 0x00, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00,
+ 0x64, 0x00, 0x69, 0x00, 0x63, 0x00, 0x32, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x67, 0x00,
+ 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x31, 0x00, 0x00, 0x00, 0x4d, 0x00,
+ 0x61, 0x00, 0x67, 0x00, 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x32, 0x00,
+ 0x00, 0x00
+};
+
+static const TUint8 CorruptedMT_ivt[] =
+{
+ 0x00, 0x01, 0x01, 0x01, 0x12, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x81, 0x00, 0x00, 0x50, 0x00, 0x65, 0x00,
+ 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00
+};
+
+//offset value for
+const TInt KEventOffset = 1000;
+
+// imaginary license key
+_LIT8( KPlainKey, "73JJNDJ38EKDKD983783JDJD84U48DJ4" );
+
+// ---------------------------------------------------------
+// VibeStatus to S60 status mappings are tested by sending these
+// special repeat values to server (calling PlayEffectRepeat).
+// The test plugin will acknowledge these special values and
+// returns corresponding VibeStatus error code..
+// ---------------------------------------------------------
+//
+enum repeat_values_4_vibestatustests
+ {
+ SUCCESS_TEST = 100,
+ ALREADY_INITIALIZED_TEST,
+ NOT_INITIALIZED_TEST,
+ INVALID_ARGUMENT_TEST,
+ FAIL_TEST,
+ INCOMPATIBLE_EFFECT_TYPE_TEST,
+ INCOMPATIBLE_CAPABILITY_TYPE_TEST,
+ INCOMPATIBLE_PROPERTY_TYPE_TEST,
+ DEVICE_NEEDS_LICENSE_TEST,
+ NOT_ENOUGH_MEMORY_TEST,
+ SERVICE_NOT_RUNNING_TEST,
+ INSUFFICIENT_PRIORITY_TEST,
+ SERVICE_BUSY_TEST,
+ WRN_NOT_PLAYING_TEST,
+ WRN_INSUFFICIENT_PRIORITY_TEST
+ };
+
+
+// - Haptics status callback implementation ---------------------------------
+THapticsStatusCallback::THapticsStatusCallback( MT_HapticsClient* aMTCallback )
+ : iHapticsStatus( MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ iMTCallback( aMTCallback )
+ {
+ }
+
+THapticsStatusCallback::~THapticsStatusCallback()
+ {
+ }
+
+MHWRMHapticsObserver::THWRMHapticsStatus THapticsStatusCallback::Status()
+ {
+ return iHapticsStatus;
+ }
+
+// ---------------------------------------------------------
+// from MHWRMHapticsObserver. Method which is called
+// by the haptics client, when the haptics status of
+// that client changes.
+// ---------------------------------------------------------
+//
+void THapticsStatusCallback::HapticsStatusChangedL( THWRMHapticsStatus aStatus )
+ {
+ iHapticsStatus = aStatus;
+
+ // inform callback of new value
+ iMTCallback->HapticsStatusReceived();
+ }
+
+// ---------------------------------------------------------
+// from MHWRMHapticsObserver. Method is for future use,
+// hence the empty implementation.
+// ---------------------------------------------------------
+//
+void THapticsStatusCallback::EffectCompletedL( TInt /*aError*/, TInt /*aEffectHandle*/ )
+ {
+ }
+
+
+// - Actuator status callback implementation ---------------------------------
+TActuatorStatusCallback::TActuatorStatusCallback( MT_HapticsClient* aMTCallback ) : iMTCallback( aMTCallback )
+ {
+ }
+
+TActuatorStatusCallback::~TActuatorStatusCallback()
+ {
+ iActuatorStatus.Close();
+ }
+
+MHWRMHapticsActuatorObserver::THWRMActuatorEvents TActuatorStatusCallback::Status( THWRMLogicalActuators aActuator )
+ {
+ TInt index = iActuatorStatus.Find( aActuator );
+ if ( index == KErrNotFound )
+ {
+ return (MHWRMHapticsActuatorObserver::THWRMActuatorEvents)0;
+ }
+ return (MHWRMHapticsActuatorObserver::THWRMActuatorEvents)(iActuatorStatus[index+1]-KEventOffset);
+ }
+
+// ---------------------------------------------------------
+// from MHWRMHapticsObserver. Method which is called
+// by the haptics client, when the haptics status of
+// that client changes.
+// ---------------------------------------------------------
+//
+void TActuatorStatusCallback::ActuatorEventL( THWRMActuatorEvents aEvent,
+ THWRMLogicalActuators aActuator )
+ {
+ TInt index = iActuatorStatus.Find( aActuator );
+ if ( index == KErrNotFound )
+ {
+ iActuatorStatus.Append( aActuator );
+ iActuatorStatus.Append( aEvent + KEventOffset );
+ }
+ else
+ {
+ iActuatorStatus.Remove( index );
+ iActuatorStatus.Remove( index );
+ iActuatorStatus.Append( aActuator );
+ iActuatorStatus.Append( aEvent + KEventOffset );
+ }
+
+ // inform callback of new value
+ iMTCallback->HapticsStatusReceived();
+ }
+
+// ---------------------------------------------------------
+// MT_HapticsTestAsyncPlaySender methods
+// ---------------------------------------------------------
+//
+MT_HapticsTestAsyncPlaySender::MT_HapticsTestAsyncPlaySender(
+ MT_HapticsClient* aMTCallback )
+ : CActive( EPriorityStandard ), iMTCallback( aMTCallback )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+MT_HapticsTestAsyncPlaySender::~MT_HapticsTestAsyncPlaySender()
+ {
+ }
+
+void MT_HapticsTestAsyncPlaySender::PlayRepeat(
+ CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TUint8 aRepeat,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus )
+ {
+ aClientStatus = KRequestPending;
+ iClientStatus = &aClientStatus;
+ aHaptics->PlayEffectRepeat( aFileHandle,
+ aEffectIndex,
+ aRepeat,
+ aEffectHandle,
+ iStatus );
+ SetActive();
+ }
+
+void MT_HapticsTestAsyncPlaySender::Play(
+ CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus )
+ {
+ aClientStatus = KRequestPending;
+ iClientStatus = &aClientStatus;
+ aHaptics->PlayEffect( aFileHandle,
+ aEffectIndex,
+ aEffectHandle,
+ iStatus );
+ SetActive();
+ }
+
+void MT_HapticsTestAsyncPlaySender::RunL()
+ {
+ *iClientStatus = iStatus.Int();
+ iMTCallback->HapticsStatusReceived();
+ }
+
+void MT_HapticsTestAsyncPlaySender::DoCancel()
+ {
+ }
+
+TInt MT_HapticsTestAsyncPlaySender::RunError( TInt /* aError */ )
+ {
+ return KErrNone;
+ }
+
+// - Construction -----------------------------------------------------------
+
+MT_HapticsClient* MT_HapticsClient::NewL()
+ {
+ MT_HapticsClient* self = MT_HapticsClient::NewLC();
+ CleanupStack::Pop();
+ return self;
+ }
+
+MT_HapticsClient* MT_HapticsClient::NewLC()
+ {
+ MT_HapticsClient* self = new( ELeave ) MT_HapticsClient();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+MT_HapticsClient::~MT_HapticsClient()
+ {
+ delete iSender;
+ }
+
+// ---------------------------------------------------------
+// Method, which is called by the status callback, when a status
+// has been received. Stops the wait loop waiting for a new status.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::HapticsStatusReceived()
+ {
+ iWait.AsyncStop();
+ }
+
+MT_HapticsClient::MT_HapticsClient()
+ {
+ }
+
+void MT_HapticsClient::ConstructL()
+ {
+ CEUnitTestSuiteClass::ConstructL();
+ iSender = new ( ELeave ) MT_HapticsTestAsyncPlaySender( this );
+ }
+
+// - Test methods -----------------------------------------------------------
+
+// ---------------------------------------------------------
+// Default test env construction
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::SetupL()
+ {
+ iHaptics = CHWRMHaptics::NewL( NULL, NULL );
+ }
+
+// ---------------------------------------------------------
+// Default test env destruction
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::Teardown()
+ {
+ if( iHaptics )
+ {
+ delete iHaptics;
+ iHaptics = NULL;
+ }
+ }
+
+// ---------------------------------------------------------
+// Empty method to be used in test case definition, when
+// there is not need to do anything in setup and/or
+// teardown.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::Dummy()
+ {
+ // nothing done here
+ }
+
+// ---------------------------------------------------------
+// Helper methods for creating various effects
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::CreateMagSweepEffect( CHWRMHaptics::THWRMHapticsMagSweepEffect& aEffect )
+ {
+ aEffect.iDuration = 1000;
+ aEffect.iMagnitude = 5000;
+ aEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleSharp;
+ aEffect.iAttackTime = 0;
+ aEffect.iAttackLevel = 0;
+ aEffect.iFadeTime = 0;
+ aEffect.iFadeLevel = 0;
+ }
+
+void MT_HapticsClient::CreatePeriodicEffect( CHWRMHaptics::THWRMHapticsPeriodicEffect& aEffect )
+ {
+ aEffect.iDuration = 1000;
+ aEffect.iMagnitude = 5000;
+ aEffect.iPeriod = 100;
+ aEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleSharp;
+ aEffect.iAttackTime = 0;
+ aEffect.iAttackLevel = 0;
+ aEffect.iFadeTime = 0;
+ aEffect.iFadeLevel = 0;
+ }
+
+void MT_HapticsClient::CreateIVTEffect( RBuf8& aBuffer, CHWRMHaptics::THWRMHapticsEffectTypes aType)
+ {
+ // Note: only magsweep and timeline IVT effects supported so far..
+ switch ( aType )
+ {
+ case CHWRMHaptics::EHWRMHapticsTypePeriodic:
+ {
+ aBuffer.ReAlloc( sizeof( Periodic4HapticsMT_ivt ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memcpy( tmpPtr, Periodic4HapticsMT_ivt, sizeof( Periodic4HapticsMT_ivt ) );
+ aBuffer.SetLength( sizeof( Periodic4HapticsMT_ivt ) );
+ break;
+ }
+ case CHWRMHaptics::EHWRMHapticsTypeMagSweep:
+ {
+ aBuffer.ReAlloc( sizeof( Magsweep4HapticsMT_ivt ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memcpy( tmpPtr, Magsweep4HapticsMT_ivt, sizeof( Magsweep4HapticsMT_ivt ) );
+ aBuffer.SetLength( sizeof( Magsweep4HapticsMT_ivt ) );
+ break;
+ }
+ case CHWRMHaptics::EHWRMHapticsTypeTimeline:
+ {
+ aBuffer.ReAlloc( sizeof( Timeline4HapticsMT_ivt ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memcpy( tmpPtr, Timeline4HapticsMT_ivt, sizeof( Timeline4HapticsMT_ivt ) );
+ aBuffer.SetLength( sizeof( Timeline4HapticsMT_ivt ) );
+ break;
+ }
+ default:
+ break; // no support for other types at the moment
+ }
+ }
+
+
+void MT_HapticsClient::CreateDummyStreamSample( TInt aSize, RBuf8& aBuffer )
+ {
+ aBuffer.ReAlloc( aSize );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memset( tmpPtr, 0x00, aSize );
+ aBuffer.SetLength( aSize );
+ }
+
+// ---------------------------------------------------------
+// Open and close haptics client-server session, i.e.
+// create and delete haptics client.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_CreateAndDeleteL()
+ {
+ // create iHaptics instance without observers
+ iHaptics = CHWRMHaptics::NewL( NULL, NULL );
+
+ // the connection has been opened successfully, if iHaptics is valid
+ EUNIT_ASSERT_DESC( iHaptics, "Haptics client creation failed!");
+
+ // the connection is closed, when iHaptics is deleted
+ delete iHaptics;
+ iHaptics = NULL;
+ }
+
+// ---------------------------------------------------------
+// Create several simultaneous sessions to haptics server.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_SeveralSessionsL()
+ {
+ // create haptics instances without observers. This creates
+ // client-server sessions (session instances in the server)
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 ); //remove once CHWRMHaptics::NewLC() is used
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 ); //remove once CHWRMHaptics::NewLC() is used
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics3 ); //remove once CHWRMHaptics::NewLC() is used
+
+ // the connection has been opened successfully, if instances are valid
+ EUNIT_ASSERT_DESC( haptics1, "First haptics client creation failed!");
+ EUNIT_ASSERT_DESC( haptics2, "Second haptics client creation failed!");
+ EUNIT_ASSERT_DESC( haptics3, "Third haptics client creation failed!");
+
+ // delete haptics instances. This removes the sessions from
+ // haptics server, and closes the server, when the last session
+ // is closed
+ CleanupStack::PopAndDestroy(3,haptics1);
+ //delete haptics1; haptics1 = NULL;
+ //delete haptics2; haptics2 = NULL;
+ //delete haptics3; haptics3 = NULL;
+ }
+
+// ---------------------------------------------------------
+// Create several consecutive sessions to haptics server.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ConsecutiveSessionsL()
+ {
+ // Do create and delete three times in a row
+ T_CreateAndDeleteL();
+ T_CreateAndDeleteL();
+ T_CreateAndDeleteL();
+ }
+
+// ---------------------------------------------------------
+// Requests the supported actuators from haptics.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_SupportedActuators()
+ {
+ TUint32 actuators = 0;
+ TInt err = KErrNone;
+ err = iHaptics->SupportedActuators( actuators );
+
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Error returned from SupportedActuators()!" );
+ EUNIT_ASSERT_DESC( actuators, "Actuators empty!");
+ }
+
+// ---------------------------------------------------------
+// Opens an actuator, which is supported by haptics.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_OpenSupportedActuator()
+ {
+ TUint32 actuators = 0;
+ TInt err = iHaptics->SupportedActuators( actuators );
+
+ // Open using first supported logical actuator type
+ if( EHWRMLogicalActuatorAny & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+ }
+ else if( EHWRMLogicalActuatorDevice & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+ }
+ else if( EHWRMLogicalActuatorPrimaryDisplay & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorPrimaryDisplay ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type PrimaryDisplay failed!" );
+ }
+ else if( EHWRMLogicalActuatorSecondaryDisplay & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorSecondaryDisplay ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type SecondaryDisplay failed!" );
+ }
+ else if( EHWRMLogicalActuatorGame & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGame ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Game failed!" );
+ }
+ else if( EHWRMLogicalActuatorGameLeft & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameLeft ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type GameLeft failed!" );
+ }
+ else if( EHWRMLogicalActuatorGameRight & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameRight ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type GameRight failed!" );
+ }
+ else if( EHWRMLogicalActuatorExternalVibra & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorExternalVibra ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type ExternalVibra failed!" );
+ }
+ }
+
+// ---------------------------------------------------------
+// Attemps to open an actuator, which is NOT supported
+// by haptics.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_OpenNotSupportedActuator()
+ {
+ TUint32 actuators = 0;
+ TInt err = iHaptics->SupportedActuators( actuators );
+
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Error returned from SupportedActuators()!" );
+
+ // Open using first NOT supported logical actuator type
+ if( !( EHWRMLogicalActuatorAny & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ }
+ else if( !( EHWRMLogicalActuatorDevice & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ }
+ else if( !( EHWRMLogicalActuatorPrimaryDisplay & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorPrimaryDisplay ) );
+ }
+ else if( !( EHWRMLogicalActuatorSecondaryDisplay & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorSecondaryDisplay ) );
+ }
+ else if( !( EHWRMLogicalActuatorGame & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGame ) );
+ }
+ else if( !( EHWRMLogicalActuatorGameLeft & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameLeft ) );
+ }
+ else if( !( EHWRMLogicalActuatorGameRight & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameRight ) );
+ }
+ else if( !( EHWRMLogicalActuatorExternalVibra & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorExternalVibra ) );
+ }
+
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Invalid error code value!" );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Opening unsupported actuator succeeded!" );
+ }
+
+// ---------------------------------------------------------
+// Attemps to open actuators, using all available logical
+// actuator types.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_OpenAllActuators()
+ {
+ TInt actuatorMask = EHWRMLogicalActuatorPrimaryDisplay | EHWRMLogicalActuatorSecondaryDisplay;
+
+ TRAPD( err, iHaptics->OpenActuatorL( (THWRMLogicalActuators)actuatorMask ) );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Opening actuator with several type mask succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorPrimaryDisplay ) );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type PrimaryDisplay succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorSecondaryDisplay ) );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type SecondaryDisplay succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGame ) );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type Game succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameLeft ) );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type GameLeft succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameRight ) );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type GameRight succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ EUNIT_ASSERT_DESC( (err == KErrAlreadyExists), "Opening actuator with type Any; wrong error code" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Opening actuator with type Device; wrong error code" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorExternalVibra ) );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Opening actuator with type ExternalVibra; wrong error code!" );
+ }
+
+// ---------------------------------------------------------
+// Creates a couple of haptic client instances, and opens
+// actuators in both of them.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_SeveralClientsWithOpenActuatorsL()
+ {
+ // create first haptics client instance
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ // create second haptics client instance
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // fetch supported actuator types
+ TUint32 actuators = 0;
+ TInt err = haptics1->SupportedActuators( actuators );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Error returned from SupportedActuators()!" );
+
+ // open actuators for both instances using supported types
+ if( EHWRMLogicalActuatorAny & actuators )
+ {
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+ }
+ else
+ {
+ EUNIT_ASSERT_DESC( EFalse, "Actuator type Any not supported!" );
+ }
+
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Plays a magsweep effect using synchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayMagSweepEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effect;
+ CreateMagSweepEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayMagSweepEffect( effect, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing magsweep effect synchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing magsweep effect synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing magsweep effect synchronously failed! (StopAllPlayingEffects)" );
+ }
+
+
+// ---------------------------------------------------------
+// Plays a magsweep effect using asynchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayMagSweepEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effect;
+ CreateMagSweepEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayMagSweepEffect( effect, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing magsweep effect asynchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing magsweep effect asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ TInt err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing magsweep effect asynchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+
+// ---------------------------------------------------------
+// Plays a periodic effect using synchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayPeriodicEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect effect;
+ CreatePeriodicEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayPeriodicEffect( effect, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing periodic effect synchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing periodic effect returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing periodic effect synchronously failed! (StopAllPlayingEffects)" );
+ }
+
+// ---------------------------------------------------------
+// Plays a periodic effect using synchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayPeriodicEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect effect;
+ CreatePeriodicEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayPeriodicEffect( effect, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing periodic effect asynchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing periodic effect asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ TInt err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing periodic effect asynchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+
+// ---------------------------------------------------------
+// Plays an IVT effect using synchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectWithDirectDataSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playingeffect IVT synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+// ---------------------------------------------------------
+// Plays an IVT effect using asynchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectWithDirectDataAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play effect
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffect( effBuf, 0, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect asynchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect asynchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using synchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectRepeatWithDirectDataSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play the effect (repeat 2 times)
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using asynchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectRepeatWithDirectDataAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play effect (repeat 2 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect repeatedly asynchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+// ---------------------------------------------------------
+// Gets the effect state while an effect:
+// a) is being played
+// b) has been paused
+// c) has been completed (i.e., is not playing any more)
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetEffectState()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effect;
+ CreateMagSweepEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayMagSweepEffect( effect, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (playing returned error)" );
+ EUNIT_ASSERT_DESC( effectHandle, "GetEffectState failed! (empty effect handle)" );
+
+ // get state
+ TInt effectState;
+ err = iHaptics->GetEffectState( effectHandle, effectState );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (1st call)" );
+ EUNIT_ASSERT_DESC( (effectState == CHWRMHaptics::EHWRMHapticsEffectPlaying), "GetEffectState failed! (1st call - wrong state)" );
+
+ // pause the effect and get state
+ err = iHaptics->PausePlayingEffect( effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (Pause)" );
+
+ err = iHaptics->GetEffectState( effectHandle, effectState );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (2nd call)" );
+ EUNIT_ASSERT_DESC( (effectState == CHWRMHaptics::EHWRMHapticsEffectPaused), "GetEffectState failed! (2nd call - wrong state)" );
+
+ // stop the effect and get state again
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (StopAllPlayingEffects)" );
+
+ err = iHaptics->GetEffectState( effectHandle, effectState );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (3rd call)" );
+ EUNIT_ASSERT_DESC( (effectState == CHWRMHaptics::EHWRMHapticsEffectNotPlaying), "GetEffectState failed! (3rd call - wrong state)" );
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using synchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// Since the effect in question is not a timeline effect (in
+// this test we use magsweep effect instead), the effect is
+// played only once.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayNonTimelineIVTEffectRepeatWithDirectDataSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect (try to repeat 2 times.. in practice will only repeat once
+ // due to the effect being non timeline effect)
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect (non-timeline) repeatedly synchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect (non-timeline) repeatedly synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect (non-timeline) repeatedly synchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using asynchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// Since the effect in question is not a timeline effect (in
+// this test we use magsweep effect instead), the effect is
+// played only once.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayNonTimelineIVTEffectRepeatWithDirectDataAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect (try to repeat 2 times.. in practice will only repeat once
+ // due to the effect being non timeline effect)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect (non-timeline) repeatedly asynchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect (non-timeline) repeatedly asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect (non-timeline) repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+void MT_HapticsClient::T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play the effect (repeat 0 times)
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffectRepeat( effBuf, 0, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly (zero repeats) synchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly (zero repeats) synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly (zero repeats) synchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+
+void MT_HapticsClient::T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play effect (repeat 0 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 0, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect repeatedly (zero repeats) asynchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly (zero repeats) asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly (zero repeats) asynchronously failed! (StopAllPlayingEffects)" );
+
+ }
+
+
+// ---------------------------------------------------------
+// Loading IVT data
+// ---------------------------------------------------------
+//
+TInt MT_HapticsClient::LoadIVTDataInternal( TInt& aFileHandle,
+ CHWRMHaptics::THWRMHapticsEffectTypes aType,
+ TBool aOpenActuator )
+ {
+ // NOTE: we can use the same IVT data as was used in previous "call PlayXXXEffect()
+ // with direct data cases (i.e., there's no need e.g. to read data from file..)
+
+ // open actuator..
+ if ( aOpenActuator )
+ {
+ T_OpenSupportedActuator();
+ }
+
+ // read effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, aType );
+
+ TInt retVal = iHaptics->LoadEffectData( effBuf, aFileHandle );
+
+ CleanupStack::PopAndDestroy(); // effBuf
+ return retVal;
+ }
+
+TInt MT_HapticsClient::LoadIVTDataInternal( TInt& aFileHandle,
+ const TUint8 aIvtData[],
+ TInt aIvtDataSize,
+ TBool aOpenActuator )
+ {
+ // open actuator..
+ if ( aOpenActuator )
+ {
+ T_OpenSupportedActuator();
+ }
+
+ // read effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ effBuf.ReAlloc( aIvtDataSize );
+ TUint8* tmpPtr = const_cast<TUint8*>( effBuf.Ptr() );
+ memcpy( tmpPtr, aIvtData, aIvtDataSize );
+ effBuf.SetLength( aIvtDataSize );
+
+ TInt retVal = iHaptics->LoadEffectData( effBuf, aFileHandle );
+
+ CleanupStack::PopAndDestroy(); // effBuf
+ return retVal;
+ }
+
+void MT_HapticsClient::T_LoadIVTData()
+ {
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (LoadIVTData case)" );
+ }
+
+
+// ---------------------------------------------------------
+// Deleting previously loaded IVT data by calling DeleteIVTData
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_DeleteIVTData()
+ {
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (DeleteIVTData case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (DeleteIVTData case)!" );
+
+ err = iHaptics->DeleteEffectData( fileHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+ }
+
+
+// ---------------------------------------------------------
+// Deleting previously loaded IVT data by calling DeleteAllIVTData
+// instead of DeleteIVTData
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_DeleteAllIVTData()
+ {
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (DeleteAllIVTData case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (DeleteAllIVTData case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_LoadAndDeleteIVTData()
+ {
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // delete each IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle1 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+ err = iHaptics->DeleteEffectData( fileHandle2 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+ err = iHaptics->DeleteEffectData( fileHandle3 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // reload IVT-data
+ fileHandle1 = KErrNotFound;
+ fileHandle2 = KErrNotFound;
+ fileHandle3 = KErrNotFound;
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data (mixed order).
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_LoadAndDeleteIVTDataMixed()
+ {
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // delete second IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle2 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // load third IVT-data once more (filehandle should not change)
+ TInt newHandle = KErrNotFound;
+ err3 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ EUNIT_ASSERT_DESC( (fileHandle3 == newHandle), "Received incorrect filehandle!" );
+
+ // load second IVT-data once more (filehandle should change)
+ newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ fileHandle1 = KErrNotFound;
+ fileHandle2 = KErrNotFound;
+ fileHandle3 = KErrNotFound;
+
+ // reload IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the synchronous play-method.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_LoadDeletePlaySync()
+ {
+ TInt effectHandle = 0;
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ TInt err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle3, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete second IVT-data
+ err = iHaptics->DeleteEffectData( fileHandle2 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffect( fileHandle3, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle3, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the asynchronous play-method.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_LoadDeletePlayAsync()
+ {
+ TRequestStatus status1 = KRequestPending;
+ TRequestStatus status2 = KRequestPending;
+ TRequestStatus status3 = KRequestPending;
+
+ TInt effectHandle = 0;
+
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ // iHaptics->PlayEffect( fileHandle1, 0, effectHandle, status1 );
+ // LoopForCompletion( status1 );
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status1 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status1 == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ iSender->Play( iHaptics, fileHandle3, 0, effectHandle, status3 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete second IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle2 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status1 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status1.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->Play( iHaptics, fileHandle3, 0, effectHandle, status3 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status3.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status1 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status1.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->Play( iHaptics, fileHandle3, 0, effectHandle, status3 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the synchronous PlayRepeat-method.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_LoadDeletePlayRepeatSync()
+ {
+ TInt effectHandle = 0;
+ TInt repeat = 2;
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ TInt err = iHaptics->PlayEffectRepeat( fileHandle1, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle3, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete second IVT-data
+ err = iHaptics->DeleteEffectData( fileHandle2 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ err = iHaptics->PlayEffectRepeat( fileHandle1, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle3, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ err = iHaptics->PlayEffectRepeat( fileHandle1, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle3, 0, repeat, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the asynchronous PlayRepeat-method.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_LoadDeletePlayRepeatAsync()
+ {
+ TRequestStatus status1 = KRequestPending;
+ TRequestStatus status2 = KRequestPending;
+ TRequestStatus status3 = KRequestPending;
+
+ TInt effectHandle = 0;
+ TInt repeat = 7;
+
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, repeat, effectHandle, status1 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status1.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle3, 0, repeat, effectHandle, status3 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete second IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle2 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, repeat, effectHandle, status1 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status1.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->PlayRepeat( iHaptics, fileHandle3, 0, repeat, effectHandle, status3 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status3.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ EUNIT_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ EUNIT_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ EUNIT_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ EUNIT_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, repeat, effectHandle, status1 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status1.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle3, 0, repeat, effectHandle, status3 );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ }
+
+
+// ---------------------------------------------------------
+// Playing the previously loaded IVT data (synchronous version)
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectWithLoadedDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing synchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ err = iHaptics->PlayEffect( fileHandle, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing synchronously case))" );
+
+ }
+
+
+// ---------------------------------------------------------
+// Playing the previously loaded IVT data (asynchronous version)
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectWithLoadedDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing asynchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Playing asynchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iSender->Play( iHaptics, fileHandle, 0, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing asynchronously case))" );
+
+ }
+
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (synchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectRepeatWithLoadedDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT synchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Repeat IVT synchronously case)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ TInt effectHandle;
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, 3, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing repeatedly loaded IVT data failed (synch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT synchronously case))" );
+
+ }
+
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (asynchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectRepeatWithLoadedDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT asynchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Repeat IVT asynchronously case)!" );
+
+ // play the effect (repeated 5 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, 5, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing repeatedly loaded IVT data failed (asynch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT asynchronously case))" );
+
+ }
+
+// ---------------------------------------------------------
+// VibeStatus to S60 status conversions
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_VibeStatusToS60StatusConversions()
+ {
+ // this is a bit ugly, i.e., we're using special repeat
+ // values and then the test adaptation stub acknowledges
+ // these special value and repeats accordingly with some
+ // (Vibe-error) status
+
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Status conversion case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Status conversion case)!" );
+
+ // the actual status conversion cases (done with special repeat values
+ // using PlayIVTEffectRepeat)
+ TInt dummyEffectHandle; // we're not interested about this in these cases
+ // first the synch cases..
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, SUCCESS_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Status conversion subcase SUCCESS_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, ALREADY_INITIALIZED_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrAlreadyExists), "Status conversion subcase ALREADY_INITIALIZED_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, NOT_INITIALIZED_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNotReady), "Status conversion subcase NOT_INITIALIZED_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INVALID_ARGUMENT_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Status conversion subcase INVALID_ARGUMENT_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, FAIL_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrGeneral), "Status conversion subcase FAIL_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INCOMPATIBLE_EFFECT_TYPE_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_EFFECT_TYPE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INCOMPATIBLE_CAPABILITY_TYPE_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_CAPABILITY_TYPE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INCOMPATIBLE_PROPERTY_TYPE_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_PROPERTY_TYPE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, DEVICE_NEEDS_LICENSE_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrAccessDenied), "Status conversion subcase DEVICE_NEEDS_LICENSE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, NOT_ENOUGH_MEMORY_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNoMemory), "Status conversion subcase NOT_ENOUGH_MEMORY_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, SERVICE_NOT_RUNNING_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNotReady), "Status conversion subcase SERVICE_NOT_RUNNING_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrAccessDenied), "Status conversion subcase INSUFFICIENT_PRIORITY_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, SERVICE_BUSY_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Status conversion subcase SERVICE_BUSY_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, WRN_NOT_PLAYING_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Status conversion subcase WRN_NOT_PLAYING_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, WRN_INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Status conversion subcase WRN_INSUFFICIENT_PRIORITY_TEST failed (synch)!" );
+
+ // then the asycnh cases
+ TRequestStatus status;
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, SUCCESS_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Status conversion subcase SUCCESS_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, ALREADY_INITIALIZED_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrAlreadyExists), "Status conversion subcase ALREADY_INITIALIZED_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, NOT_INITIALIZED_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNotReady), "Status conversion subcase NOT_INITIALIZED_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INVALID_ARGUMENT_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrArgument), "Status conversion subcase INVALID_ARGUMENT_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, FAIL_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrGeneral), "Status conversion subcase FAIL_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INCOMPATIBLE_EFFECT_TYPE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_EFFECT_TYPE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INCOMPATIBLE_CAPABILITY_TYPE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_CAPABILITY_TYPE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INCOMPATIBLE_PROPERTY_TYPE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_PROPERTY_TYPE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, DEVICE_NEEDS_LICENSE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrAccessDenied), "Status conversion subcase DEVICE_NEEDS_LICENSE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, NOT_ENOUGH_MEMORY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNoMemory), "Status conversion subcase NOT_ENOUGH_MEMORY_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, SERVICE_NOT_RUNNING_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNotReady), "Status conversion subcase SERVICE_NOT_RUNNING_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrAccessDenied), "Status conversion subcase INSUFFICIENT_PRIORITY_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, SERVICE_BUSY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse), "Status conversion subcase SERVICE_BUSY_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, WRN_NOT_PLAYING_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrArgument), "Status conversion subcase WRN_NOT_PLAYING_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, WRN_INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Status conversion subcase WRN_INSUFFICIENT_PRIORITY_TEST failed (asynch)!" );
+ }
+
+// ---------------------------------------------------------
+// Load multiple IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_LoadMultipleIVTData()
+ {
+ TInt fileHandle;
+ TInt prevFileHandle;
+
+ // load the IVT data
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Load multiple IVT-data case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Load multiple IVT-data case)!" );
+ prevFileHandle = fileHandle;
+
+ // load the IVT data
+ fileHandle = 0;
+ err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline ,EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Load multiple IVT-data case)!" );
+ EUNIT_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Load multiple IVT-data case)!" );
+ EUNIT_ASSERT_DESC( fileHandle!=prevFileHandle, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // try to load the same IVT data as before
+ fileHandle = 0;
+ err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Load multiple IVT-data case)!" );
+ EUNIT_ASSERT_DESC( fileHandle == prevFileHandle, "Loading IVT data failed, wrong fileHandle (Load multiple IVT-data case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing synchronously case))" );
+ }
+
+// ---------------------------------------------------------
+// Playing from multiple IVT data (synchronous version)
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectsFromMultipleIVTDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing synchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing synchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ TInt unknownFileHandle = 3;
+ err = iHaptics->PlayEffect( unknownFileHandle, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing loaded IVT data failed, not bad handle (synch)!" );
+ EUNIT_ASSERT_DESC( !effectHandle, "Playing loaded IVT data failed, not empty effectHandle (synch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing synchronously case))" );
+
+ }
+
+// ---------------------------------------------------------
+// Playing the previously loaded IVT data (asynchronous version)
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectsFromMultipleIVTDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing asynchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Playing asynchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing asynchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Playing asynchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ status = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ status = KRequestPending;
+ TInt unknownFileHandle = 3;
+ iSender->Play( iHaptics, unknownFileHandle, 0, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrBadHandle), "Playing loaded IVT data failed, not bad handle (asynch)!" );
+ EUNIT_ASSERT_DESC( !effectHandle, "Playing loaded IVT data failed, not empty effectHandle (asynch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing asynchronously case))" );
+
+ }
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (synchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectRepeatFromMultipleIVTDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT synchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Repeat IVT synchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT synchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Repeat IVT synchronously case)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ TInt effectHandle;
+ err = iHaptics->PlayEffectRepeat( fileHandle1, 0, 3, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing repeatedly loaded IVT data failed (synch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ effectHandle = 0;
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, 3, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing repeatedly loaded IVT data failed (synch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ effectHandle = 0;
+ TInt unknownFileHandle = 3;
+ err = iHaptics->PlayEffectRepeat( unknownFileHandle, 0, 3, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Playing repeatedly loaded IVT data failed, not bad handle (synch)!" );
+ EUNIT_ASSERT_DESC( !effectHandle, "Playing repeatedly loaded IVT data failed, not empty effectHandle (synch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT synchronously case))" );
+
+ }
+
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (asynchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayIVTEffectRepeatFromMultipleIVTDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT asynchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Repeat IVT asynchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT asynchronously case)!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Repeat IVT asynchronously case)!" );
+
+ // play the effect (repeated 5 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, 5, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing repeatedly loaded IVT data failed (asynch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect (repeated 5 times)
+ effectHandle = 0;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, 5, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Playing repeatedly loaded IVT data failed (asynch)!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect (repeated 5 times)
+ effectHandle = 0;
+ status = KRequestPending;
+ TInt unknownFileHandle = 3;
+ iSender->PlayRepeat( iHaptics, unknownFileHandle, 0, 5, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrBadHandle), "Playing repeatedly loaded IVT data failed, not bad handle (asynch)!" );
+ EUNIT_ASSERT_DESC( !effectHandle, "Playing repeatedly loaded IVT data failed, not empty effectHandle (asynch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT asynchronously case))" );
+ }
+
+// ---------------------------------------------------------
+// Releasing previously reserved haptics
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ReserveAndReleaseHaptics()
+ {
+ // reserve
+ TRAPD( err, iHaptics->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Release haptics case failed (ReserveHapticsL leaves)!" );
+
+ // release (does not return an error code)
+ iHaptics->ReleaseHaptics();
+ }
+
+// ---------------------------------------------------------
+// Reserving haptics several (in this case three) times
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ReserveHapticsSeveralTimes()
+ {
+ TRAPD( err, iHaptics->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics (1st call) failed!" );
+ TRAP( err, iHaptics->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics (2nd call) failed!" );
+ TRAP( err, iHaptics->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics (3rd call) failed!" );
+ }
+
+// ---------------------------------------------------------
+// Reserving haptics
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ReserveHapticsNoReleaseL()
+ {
+ // create first haptics instance
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ // reserve
+ TRAPD( err, haptics1->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // create second haptics instance and open actuator
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // play an effect using second client (should fail because
+ // of reservation)
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TInt effectHandle = 0;
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although server reserved!" );
+
+ // destroy first client --> should release reservation
+ CleanupStack::PopAndDestroy( haptics1 );
+
+ // play an effect using second client (should succeed, since no
+ // reservation)
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed (no reservation)!" );
+
+ // cleanup
+ effBuf.Close();
+ delete haptics2;
+ }
+
+// ---------------------------------------------------------
+// Releasing haptics when it has not been previously reserved
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ReleaseHapticsWithoutReservingFirst()
+ {
+ // no return values nor leave to check, just execute
+ iHaptics->ReleaseHaptics();
+ }
+
+// ---------------------------------------------------------
+// Tries to reserve haptics with forceNoCoeEnv flag on.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ReserveNoAutomaticFocusNotTrusted()
+ {
+ TRAPD( err, iHaptics->ReserveHapticsL( ETrue ) );
+ EUNIT_ASSERT_DESC( (err == KErrAccessDenied), "Reservation succeeded although not a trusted client!" );
+ }
+
+// ---------------------------------------------------------
+// Tries to reserve haptics, when it has already been
+// reserved for another client with higher priority.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ReserveAlreadyReservedHigherL()
+ {
+ // create haptics instances and open actuators
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set first client priority (max)
+ haptics1->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+
+ // reserve
+ TRAP( err, haptics1->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // set second client priority (min)
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+
+ // reserve
+ TRAP( err, haptics2->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // play effect using the second client
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TInt effectHandle = 0;
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release first client's reservation
+ haptics1->ReleaseHaptics();
+
+ // play effect using the second client
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release second client's reservation
+ haptics2->ReleaseHaptics();
+
+ // cleanup
+ effBuf.Close();
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Tries to reserve haptics, when it has already been
+// reserved for another client with lower priority.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ReserveAlreadyReservedLowerL()
+ {
+ // create haptics instances and open actuators
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set first client priority (min)
+ haptics1->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+
+ // reserve
+ TRAP( err, haptics1->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // set second client priority (max)
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+
+ // reserve
+ TRAP( err, haptics2->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // play effect using first client
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TInt effectHandle = 0;
+ err = haptics1->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // play effect using second client
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release second client
+ haptics2->ReleaseHaptics();
+
+ // play effect using first client
+ err = haptics1->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // play effect using second client
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release first client
+ haptics1->ReleaseHaptics();
+
+ // cleanup
+ effBuf.Close();
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Tries to play effects, when haptics has been reserved
+// for a higher priority client.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayWhenReservedL()
+ {
+ // create haptics instances and open actuators
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set first client priority (max)
+ haptics1->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+
+ // reserve for first client
+ TRAP( err, haptics1->ReserveHapticsL() );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // set second client priority (min)
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+
+ // play effects using second client, when reserved for the first
+ // --->
+
+ // create effect data for playing effect directly using IVT-data
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // load the IVT data for playing effects using filehandle
+ TInt fileHandle = 0;
+ err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed!" );
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect magSweepEffect;
+ CreateMagSweepEffect( magSweepEffect );
+
+ // create a periodic effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect periodicEffect;
+ CreatePeriodicEffect( periodicEffect );
+
+ TInt effectHandle = 0;
+ TRequestStatus status = KRequestPending;
+
+ // synchronous play with data
+ err = iHaptics->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous play-repeat with data
+ err = iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play with data
+ status = KRequestPending;
+ iHaptics->PlayEffect( effBuf, 0, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play-repeat with data
+ status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous play with filehandle
+ err = iHaptics->PlayEffect( fileHandle, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous play-repeat with filehandle
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, 2, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play with filehandle
+ status = KRequestPending;
+ iSender->Play( iHaptics, fileHandle, 0, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play-repeat with filehandle
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, 2, effectHandle, status );
+ iWait.Start();
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous manual magsweep
+ err = iHaptics->PlayMagSweepEffect( magSweepEffect, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous manual periodic
+ err = iHaptics->PlayPeriodicEffect( periodicEffect, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous manual magsweep
+ status = KRequestPending;
+ iHaptics->PlayMagSweepEffect( magSweepEffect, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous manual periodic
+ status = KRequestPending;
+ iHaptics->PlayPeriodicEffect( periodicEffect, effectHandle, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // <---
+
+ // cleanup
+ effBuf.Close();
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Getting effect count from preloaded IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetIVTEffectCount()
+ {
+ TInt fileHandle1;
+ TInt fileHandle2;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectCount case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectCount case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectCount case)!" );
+ EUNIT_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectCount case)!" );
+
+ // load the IVT effect set 2
+ err = LoadIVTDataInternal( fileHandle2, Magsweep4HapticsMT_ivt,
+ sizeof( Magsweep4HapticsMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectCount case)!" );
+ EUNIT_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (GetIVTEffectCount case)!" );
+
+
+ TInt effectCount;
+ // get effect count from IVT-data 1
+ err = iHaptics->GetEffectCount( fileHandle1, effectCount );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect count failed (GetIVTEffectCount case)!" );
+ EUNIT_ASSERT_DESC( (effectCount == 6), "Wrong effect count (GetIVTEffectCount case)!" );
+
+ // get effect count from corrupted IVT-data
+ err = iHaptics->GetEffectCount( corruptedFile, effectCount );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Get count from corrupted IVT-data, incorrect error code (GetIVTEffectCount case)!" );
+
+ // get effect count from IVT-data 2
+ err = iHaptics->GetEffectCount( fileHandle2, effectCount );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect count failed (GetIVTEffectCount case)!" );
+ EUNIT_ASSERT_DESC( (effectCount == 1), "Wrong effect count (GetIVTEffectCount case)!" );
+
+ // get effect count using unknown file handle
+ err = iHaptics->GetEffectCount( unknownFileHandle, effectCount );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectCount case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectCount case))" );
+ }
+
+// ---------------------------------------------------------
+// Getting effect duration from preloaded IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetIVTEffectDuration()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectDuration case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ EUNIT_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectDuration case)!" );
+
+ TInt effectDuration;
+ // duration of the last effect
+ TInt index = 5;
+ err = iHaptics->GetEffectDuration( fileHandle1, index, effectDuration );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get duration failed (GetIVTEffectDuration case)!" );
+ EUNIT_ASSERT_DESC( (effectDuration == 4000), "Wrong duration (GetIVTEffectDuration case)!" );
+
+ // get duration using effect index out of bounds
+ index = 6;
+ err = iHaptics->GetEffectDuration( fileHandle1, index, effectDuration );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get duration succeeded (GetIVTEffectDuration case)!" );
+
+ // get duration from corrupted IVT-data
+ index = 0; err = KErrNone;
+ err = iHaptics->GetEffectDuration( corruptedFile, index, effectDuration );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Get duration from corrupted data, incorrect error code (GetIVTEffectDuration case)!" );
+
+ // duration of the first effect
+ index = 0;
+ err = iHaptics->GetEffectDuration( fileHandle1, index, effectDuration );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get duration failed (GetIVTEffectDuration case)!" );
+ EUNIT_ASSERT_DESC( (effectDuration == 3915), "Wrong duration (GetIVTEffectDuration case)!" );
+
+ // get duration using unknown file handle
+ index = 0;
+ err = iHaptics->GetEffectDuration( unknownFileHandle, index, effectDuration );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectDuration case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectDuration case))" );
+ }
+
+// ---------------------------------------------------------
+// Getting effect index from preloaded IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetIVTEffectIndexFromName()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetEffectIndexFromName case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetEffectIndexFromName case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetEffectIndexFromName case)!" );
+ EUNIT_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetEffectIndexFromName case)!" );
+
+
+ TInt effectIndex;
+ _LIT8( KFirstName, "Timeline1" );
+ _LIT8( KLastName, "MagSweep2" );
+ _LIT8( KUnknownName, "Tiline1" );
+ TBuf8<128> effectName;
+
+ // get index of the first name
+ effectName = KFirstName;
+ err = iHaptics->GetEffectIndexFromName( fileHandle1, effectName, effectIndex );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect index failed (GetEffectIndexFromName case)!" );
+ EUNIT_ASSERT_DESC( (effectIndex == 0), "Wrong effect index (GetEffectIndexFromName case)!" );
+
+ // get index of the last name
+ effectName = KLastName;
+ err = iHaptics->GetEffectIndexFromName( fileHandle1, effectName, effectIndex );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect index failed (GetEffectIndexFromName case)!" );
+ EUNIT_ASSERT_DESC( (effectIndex == 5), "Wrong effect index (GetEffectIndexFromName case)!" );
+
+ // get index from corrupted IVT-data
+ effectName = KFirstName;
+ err = iHaptics->GetEffectIndexFromName( corruptedFile, effectName, effectIndex );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Get effect index from corrupted data, incorrect error code (GetEffectIndexFromName case)!" );
+
+ // get index using unknown name
+ effectName = KUnknownName;
+ err = iHaptics->GetEffectIndexFromName( fileHandle1, effectName, effectIndex );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get effect succeeded (GetEffectIndexFromName case)!" );
+
+ // get index using unknown file handle
+ effectName = KUnknownName;
+ err = iHaptics->GetEffectIndexFromName( unknownFileHandle, effectName, effectIndex );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetEffectIndexFromName case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetEffectIndexFromName case))" );
+ }
+
+
+// ---------------------------------------------------------
+// Getting effect type from preloaded IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetIVTEffectType()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectType case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectType case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectType case)!" );
+ EUNIT_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectType case)!" );
+
+
+ // get type of the first effect
+ TInt effectType;
+ TInt effectIndex = 0;
+ err = iHaptics->GetEffectType( fileHandle1, effectIndex, effectType );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect type failed (GetIVTEffectType case)!" );
+ EUNIT_ASSERT_DESC( (effectType == CHWRMHaptics::EHWRMHapticsTypeTimeline), "Wrong effect type (GetIVTEffectType case)!" );
+
+ // get type from corrupted IVT-data
+ effectIndex = 5;
+ err = iHaptics->GetEffectType( corruptedFile, effectIndex, effectType );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Get effect type from corrupted data, incorrect error code (GetIVTEffectType case)!" );
+
+ // get type of the last effect
+ effectIndex = 5;
+ err = iHaptics->GetEffectType( fileHandle1, effectIndex, effectType );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect type failed (GetIVTEffectType case)!" );
+ EUNIT_ASSERT_DESC( (effectType == CHWRMHaptics::EHWRMHapticsTypeMagSweep), "Wrong effect type (GetIVTEffectType case)!" );
+
+ // get type using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetEffectType( fileHandle1, effectIndex, effectType );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get effect type succeeded (GetIVTEffectType case)!" );
+
+ // get type using unknown file handle
+ effectIndex = 6;
+ err = iHaptics->GetEffectType( unknownFileHandle, effectIndex, effectType );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectType case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectType case))" );
+ }
+
+// ---------------------------------------------------------
+// Getting effect name from preloaded IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetIVTEffectName()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectName case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ EUNIT_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectName case)!" );
+
+
+ // get name of the first effect
+ TBuf8<128> effectName;
+ TInt effectIndex = 0;
+ _LIT8( KTimeline1, "Timeline1" );
+ _LIT8( KMagSweep2, "MagSweep2" );
+ err = iHaptics->GetEffectName( fileHandle1, effectIndex, effectName );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect name failed (GetIVTEffectName case)!" );
+ EUNIT_ASSERT_DESC( (effectName == KTimeline1), "Wrong effect name (GetIVTEffectName case)!" );
+
+ // get name from corrupted IVT-data
+ effectIndex = 0;
+ err = iHaptics->GetEffectName( corruptedFile, effectIndex, effectName );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Get effect name from corrupted data, incorrect error code (GetIVTEffectName case)!" );
+
+ // get name of the last effect
+ effectIndex = 5;
+ err = iHaptics->GetEffectName( fileHandle1, effectIndex, effectName );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect name failed (GetIVTEffectName case)!" );
+ EUNIT_ASSERT_DESC( (effectName == KMagSweep2), "Wrong effect name (GetIVTEffectType case)!" );
+
+ // get name using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetEffectName( fileHandle1, effectIndex, effectName );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get effect name succeeded (GetIVTEffectName case)!" );
+
+ // get name using unknown file handle
+ effectIndex = 0;
+ err = iHaptics->GetEffectName( unknownFileHandle, effectIndex, effectName );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectName case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectName case))" );
+ }
+
+// ---------------------------------------------------------
+// Getting MagSweep effect definition from preloaded IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetIVTMagSweepEffectDefinition()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTMagSweepEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTMagSweepEffectDefinition case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTMagSweepEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTMagSweepEffectDefinition case)!" );
+
+
+ // get definition of the first MagSweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effectDefinition;
+ TInt effectIndex = 4;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTMagSweepEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( (effectDefinition.iDuration == 3000), "Wrong effect definition (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition from corrupted IVT-data
+ effectIndex = 0;
+ err = iHaptics->GetMagSweepEffectDefinition( corruptedFile, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Get effect definition from corrupted data, incorrect error code (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition of the last MagSweep effect
+ effectIndex = 5;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTMagSweepEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( (effectDefinition.iDuration == 4000), "Wrong effect definition (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition using effect index not pointing to MagSweep effect
+ effectIndex = 2;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition using unknown file handle
+ effectIndex = 0;
+ err = iHaptics->GetMagSweepEffectDefinition( unknownFileHandle, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTMagSweepEffectDefinition case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTMagSweepEffectDefinition case))" );
+ }
+
+// ---------------------------------------------------------
+// Getting Periodic effect definition from preloaded IVT-data
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetIVTPeriodicEffectDefinition()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTPeriodicEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTPeriodicEffectDefinition case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTPeriodicEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTPeriodicEffectDefinition case)!" );
+
+
+ // get definition of the first Periodic effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect effectDefinition;
+ TInt effectIndex = 2;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTPeriodicEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( (effectDefinition.iDuration == 1000), "Wrong effect definition (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition from corrupted IVT-data
+ effectIndex = 0;
+ err = iHaptics->GetPeriodicEffectDefinition( corruptedFile, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Get effect definition from corrupted data, incorrect error code (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition of the last Periodic effect
+ effectIndex = 3;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTPeriodicEffectDefinition case)!" );
+ EUNIT_ASSERT_DESC( (effectDefinition.iDuration == 2000), "Wrong effect definition (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition using effect index not pointing to Periodic effect
+ effectIndex = 5;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition using unknown file handle
+ effectIndex = 0;
+ err = iHaptics->GetPeriodicEffectDefinition( unknownFileHandle, effectIndex, effectDefinition );
+ EUNIT_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTPeriodicEffectDefinition case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTPeriodicEffectDefinition case))" );
+ }
+
+// ---------------------------------------------------------
+// Open asynchronously and close haptics client-server session, i.e.
+// create and delete haptics client.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_CreateAndDeleteAsynchronousL()
+ {
+ // create iHaptics instance without observers
+ TRequestStatus status;
+ iHaptics = CHWRMHaptics::NewL( NULL, NULL, status );
+ User::WaitForRequest( status );
+
+ // the connection has been opened successfully, if iHaptics is valid and
+ // error code is not returned
+ EUNIT_ASSERT_DESC( status == KErrNone, "Haptics client creation failed!");
+ EUNIT_ASSERT_DESC( iHaptics, "Haptics client creation failed!");
+
+ // the connection is closed, when iHaptics is deleted
+ delete iHaptics;
+ iHaptics = NULL;
+ }
+
+// ---------------------------------------------------------
+// Create several simultaneous sessions to haptics server
+// asynchronously.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_SeveralSessionsAsynchronousL()
+ {
+ // create haptics instances without observers. This creates
+ // client-server sessions (session instances in the server)
+ TRequestStatus status1;
+ TRequestStatus status2;
+ TRequestStatus status3;
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL, status1 );
+ CleanupStack::PushL( haptics1 ); //remove once CHWRMHaptics::NewLC() is used
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL, status2 );
+ CleanupStack::PushL( haptics2 ); //remove once CHWRMHaptics::NewLC() is used
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( NULL, NULL, status3 );
+ CleanupStack::PushL( haptics3 ); //remove once CHWRMHaptics::NewLC() is used
+ User::WaitForRequest( status1 );
+ User::WaitForRequest( status2 );
+ User::WaitForRequest( status3 );
+
+ // the connection has been opened successfully, if instances are valid and
+ // error code is not returned
+ EUNIT_ASSERT_DESC( status1 == KErrNone, "First haptics client creation failed!");
+ EUNIT_ASSERT_DESC( status2 == KErrNone, "Second haptics client creation failed!");
+ EUNIT_ASSERT_DESC( status3 == KErrNone, "Third haptics client creation failed!");
+ EUNIT_ASSERT_DESC( haptics1, "First haptics client creation failed!");
+ EUNIT_ASSERT_DESC( haptics2, "Second haptics client creation failed!");
+ EUNIT_ASSERT_DESC( haptics3, "Third haptics client creation failed!");
+
+ // delete haptics instances. This removes the sessions from
+ // haptics server, and closes the server, when the last session
+ // is closed
+ CleanupStack::PopAndDestroy(3, haptics1);
+ //delete haptics1; haptics1 = NULL;
+ //delete haptics2; haptics2 = NULL;
+ //delete haptics3; haptics3 = NULL;
+ }
+
+// ---------------------------------------------------------
+// Create several consecutive sessions asynchronously
+// to haptics server.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ConsecutiveSessionsAsynchronousL()
+ {
+ // Do create and delete three times in a row
+ T_CreateAndDeleteAsynchronousL();
+ T_CreateAndDeleteAsynchronousL();
+ T_CreateAndDeleteAsynchronousL();
+ }
+
+// ---------------------------------------------------------
+// Attemps to pause an effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PauseEffect()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // pause effect testing
+ TInt err = iHaptics->PausePlayingEffect( 0 );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Pausing an effect with handle 0 failed!");
+ err = iHaptics->PausePlayingEffect( INT_MIN );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Pausing an effect with handle INT_MIN failed!");
+ err = iHaptics->PausePlayingEffect( INT_MAX );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Pausing an effect with handle INT_MAX failed!");
+ }
+
+// ---------------------------------------------------------
+// Attemps to resume an effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ResumeEffect()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // resume effect testing
+ TInt err = iHaptics->ResumePausedEffect( 0 );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Resuming an effect with handle 0 failed!");
+ err = iHaptics->ResumePausedEffect( INT_MIN );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Resuming an effect with handle INT_MIN failed!");
+ err = iHaptics->ResumePausedEffect( INT_MAX );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Resuming an effect with handle INT_MAX failed!");
+ }
+
+// ---------------------------------------------------------
+// Attemps to stop an effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_StopEffect()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // stop effect testing
+ TInt err = iHaptics->StopPlayingEffect( 0 );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Stopping an effect with handle 0 failed!");
+ err = iHaptics->StopPlayingEffect( INT_MIN );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Stopping an effect with handle INT_MIN failed!");
+ err = iHaptics->StopPlayingEffect( INT_MAX );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Stopping an effect with handle INT_MAX failed!");
+ }
+
+// ---------------------------------------------------------
+// Attemps to stop all effects.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_StopAllEffects()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // resume effect testing
+ TInt err = iHaptics->StopAllPlayingEffects();
+ EUNIT_ASSERT_DESC( err == KErrNone, "Stopping all effects failed!");
+ }
+
+// ---------------------------------------------------------
+// Executes sequence: play effect, pause, resume, stop.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayPauseResumeStop()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect
+ TInt effectHandle = 0;
+ TInt err = iHaptics->PlayEffect( effBuf, 0, effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Playing IVT effect synchronously returned empty effect handle!" );
+
+ // cleanup buffer
+ CleanupStack::PopAndDestroy( &effBuf );
+
+ // pause the effect
+ err = iHaptics->PausePlayingEffect( effectHandle );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Pausing the effect failed!");
+
+ // resume the effect
+ err = iHaptics->ResumePausedEffect( effectHandle );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Resuming the effect failed!");
+
+ // stop the effect
+ err = iHaptics->StopPlayingEffect( effectHandle );
+ EUNIT_ASSERT_DESC( err == KErrNone, "Stopping the effect failed!");
+ }
+
+// ---------------------------------------------------------
+// Constant getters testing.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ConstantGetters()
+ {
+ const TInt expectedInfRepeat = 255; // VIBE_REPEAT_COUNT_INFINITE
+ const TInt expectedInfDuration = INT_MAX; // VIBE_TIME_INFINITE;
+ const TInt expectedMaxEffNameLen = 128; // VIBE_MAX_EFFECT_NAME_LENGTH
+ const TInt expectedMaxDevNameLen = 64; // VIBE_MAX_DEVICE_NAME_LENGTH
+ const TInt expectedMaxCapaStrLen = 64; // VIBE_MAX_CAPABILITY_STRING_LENGTH
+ const TInt expectedMaxPropStrLen = 64; // VIBE_MAX_PROPERTY_STRING_LENGTH
+ const TInt expectedMaxStrmSampleLen = 255; // VIBE_MAX_STREAMING_SAMPLE_SIZE
+ const TInt expectedDefaultDevPriority = 0; // VIBE_DEVPRIORITY_DEFAULT
+
+ TInt infRepeat = iHaptics->InfiniteRepeat();
+ EUNIT_ASSERT_DESC( KErrNotReady == infRepeat, "InfiniteRepeat() wrong error code" );
+ TInt infDuration = iHaptics->InfiniteDuration();
+ EUNIT_ASSERT_DESC( KErrNotReady == infDuration, "InfiniteDuration() wrong error code" );
+ TInt maxEffNameLen = iHaptics->MaxEffectNameLength();
+ EUNIT_ASSERT_DESC( KErrNotReady == maxEffNameLen, "MaxEffectNameLength() wrong error code" );
+ TInt maxDevNameLen = iHaptics->MaxDeviceNameLength();
+ EUNIT_ASSERT_DESC( KErrNotReady == maxDevNameLen, "MaxDeviceNameLength() wrong error code" );
+ TInt maxCapaStrLen = iHaptics->MaxCapabilityStringLength();
+ EUNIT_ASSERT_DESC( KErrNotReady == maxCapaStrLen, "MaxCapabilityStringLength() wrong error code" );
+ TInt maxPropStrLen = iHaptics->MaxPropertyStringLength();
+ EUNIT_ASSERT_DESC( KErrNotReady == maxPropStrLen, "MaxPropertyStringLength() wrong error code" );
+ TInt maxStrmSampleLen = iHaptics->MaxStreamingSampleSize();
+ EUNIT_ASSERT_DESC( KErrNotReady == maxStrmSampleLen, "MaxStreamingSampleSize() wrong error code" );
+ TInt defaultDevPriority = iHaptics->DefaultDevicePriority();
+ EUNIT_ASSERT_DESC( KErrNotReady == defaultDevPriority, "DefaultDevicePriority() wrong error code" );
+
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ infRepeat = iHaptics->InfiniteRepeat();
+ EUNIT_ASSERT_DESC( expectedInfRepeat == infRepeat, "InfiniteRepeat() failed" );
+ infDuration = iHaptics->InfiniteDuration();
+ EUNIT_ASSERT_DESC( expectedInfDuration == infDuration, "InfiniteDuration() failed" );
+ maxEffNameLen = iHaptics->MaxEffectNameLength();
+ EUNIT_ASSERT_DESC( expectedMaxEffNameLen == maxEffNameLen, "MaxEffectNameLength() failed" );
+ maxDevNameLen = iHaptics->MaxDeviceNameLength();
+ EUNIT_ASSERT_DESC( expectedMaxDevNameLen == maxDevNameLen, "MaxDeviceNameLength() failed" );
+ maxCapaStrLen = iHaptics->MaxCapabilityStringLength();
+ EUNIT_ASSERT_DESC( expectedMaxCapaStrLen == maxCapaStrLen, "MaxCapabilityStringLength() failed" );
+ maxPropStrLen = iHaptics->MaxPropertyStringLength();
+ EUNIT_ASSERT_DESC( expectedMaxPropStrLen == maxPropStrLen, "MaxPropertyStringLength() failed" );
+ maxStrmSampleLen = iHaptics->MaxStreamingSampleSize();
+ EUNIT_ASSERT_DESC( expectedMaxStrmSampleLen == maxStrmSampleLen, "MaxStreamingSampleSize() failed" );
+ defaultDevPriority = iHaptics->DefaultDevicePriority();
+ EUNIT_ASSERT_DESC( expectedDefaultDevPriority == defaultDevPriority, "DefaultDevicePriority() failed" );
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing magsweep effect using synchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ModifyMagSweepEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect modifiedEffect;
+ modifiedEffect.iDuration = 3030;
+ modifiedEffect.iMagnitude = 7070;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TInt err = iHaptics->ModifyPlayingMagSweepEffect( 0, modifiedEffect );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Modifying magsweep effect with handle 0 failed!" );
+
+ err = iHaptics->ModifyPlayingMagSweepEffect( INT_MIN, modifiedEffect );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Modifying magsweep effect with handle INT_MIN failed!" );
+
+ err = iHaptics->ModifyPlayingMagSweepEffect( INT_MAX, modifiedEffect );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Modifying magsweep effect with handle INT_MAX failed!" );
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing magsweep effect using asynchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ModifyMagSweepEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect modifiedEffect;
+ modifiedEffect.iDuration = 5050;
+ modifiedEffect.iMagnitude = 1010;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TRequestStatus status = KRequestPending;
+ iHaptics->ModifyPlayingMagSweepEffect( 0, modifiedEffect, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Modifying magsweep effect with handle 0 failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingMagSweepEffect( INT_MIN, modifiedEffect, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Modifying magsweep effect with handle INT_MIN failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingMagSweepEffect( INT_MAX, modifiedEffect, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Modifying magsweep effect with handle INT_MAX failed!" );
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing periodic effect using synchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ModifyPeriodicEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect modifiedEffect;
+ modifiedEffect.iDuration = 6060;
+ modifiedEffect.iMagnitude = 2020;
+ modifiedEffect.iPeriod = 200;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TInt err = iHaptics->ModifyPlayingPeriodicEffect( 0, modifiedEffect );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Modifying periodic effect with handle 0 failed!" );
+
+ err = iHaptics->ModifyPlayingPeriodicEffect( INT_MIN, modifiedEffect );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Modifying periodic effect with handle INT_MIN failed!" );
+
+ err = iHaptics->ModifyPlayingPeriodicEffect( INT_MAX, modifiedEffect );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Modifying periodic effect with handle INT_MAX failed!" );
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing periodic effect using asynchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ModifyPeriodicEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect modifiedEffect;
+ modifiedEffect.iDuration = 4040;
+ modifiedEffect.iMagnitude = 6060;
+ modifiedEffect.iPeriod = 200;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TRequestStatus status = KRequestPending;
+ iHaptics->ModifyPlayingPeriodicEffect( 0, modifiedEffect, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Modifying periodic effect with handle 0 failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingPeriodicEffect( INT_MIN, modifiedEffect, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Modifying periodic effect with handle INT_MIN failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingPeriodicEffect( INT_MAX, modifiedEffect, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone), "Modifying periodic effect with handle INT_MAX failed!" );
+ }
+
+// ---------------------------------------------------------
+// Gets device TInt property
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetDeviceProperty_TInt_TInt()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get the same value 1
+ TInt retValue (0);
+ TInt err = iHaptics->GetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, retValue );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Getting device property (Strength) failed(1)!" );
+
+ err = iHaptics->GetDeviceProperty( CHWRMHaptics::EHWRMHapticsDisableEffects, retValue );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Getting device property (disableEffects) failed(1)!" );
+ }
+
+// ---------------------------------------------------------
+// Gets device TDesC property
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetDeviceProperty_TInt_TDesC()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get property
+ TBuf8<100> retValue;
+ TInt err = iHaptics->GetDeviceProperty( CHWRMHaptics::EHWRMHapticsLicensekey, retValue );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Setting device property (EHWRMHapticsLicensekey) failed!" );
+ }
+
+// ---------------------------------------------------------
+// Sets device TInt property
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_SetDeviceProperty_TInt_TInt()
+ {
+ const TInt KSomeValue = 50;
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // set property
+ TInt err = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, KSomeValue );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Setting device property (Strength) failed!" );
+
+ err = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsDisableEffects, 0 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Setting device property (disableEffects) failed!" );
+ }
+
+// ---------------------------------------------------------
+// Sets device TDesC property
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_SetDeviceProperty_TInt_TDesC()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // set property
+ TInt err = iHaptics->SetDeviceProperty(
+ CHWRMHaptics::EHWRMHapticsLicensekey,
+ KNullDesC8 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Setting device property (NULL license key) failed!" );
+
+ err = iHaptics->SetDeviceProperty(
+ CHWRMHaptics::EHWRMHapticsLicensekey,
+ KPlainKey );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Setting device property (license key) failed!" );
+ }
+
+// ---------------------------------------------------------
+// Gets device TInt capability
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetDeviceCapability_TInt_TInt()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get the value
+ TInt retValue (0);
+ TInt expectedValue (1); // from testplugin's stubresponse.txt
+ TInt err = iHaptics->GetDeviceCapability( CHWRMHaptics::EHWRMHapticsMaxNestedRepeats, retValue );
+ EUNIT_ASSERT_DESC( (err == KErrNone),
+ "Getting device property (MaxNestedRepeats) failed!" );
+ EUNIT_ASSERT_DESC( expectedValue == retValue,
+ "Getting device property (MaxNestedRepeats) failed, wrong value!")
+ }
+
+// ---------------------------------------------------------
+// Gets device TDesC capability
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetDeviceCapability_TInt_TDesC()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get the same value
+ TBuf8<100> retValue;
+ retValue.FillZ(); // sets length, important here..
+ TInt err = iHaptics->GetDeviceCapability( CHWRMHaptics::EHWRMHapticsDeviceName, retValue );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Getting device property (DevName) failed!" );
+ // the following are based on what the testplugin retunrs (i.e., bytes
+ // containing the ASCII character values for "S","T","U" and "B")
+ const TInt expectedSize( 4 );
+ EUNIT_ASSERT_DESC( expectedSize == retValue.Size(),
+ "Getting device property (DevName) failed, wrong length!" );
+ const TUint8 ascii4S( 0x53 );
+ const TUint8 ascii4T( 0x54 );
+ const TUint8 ascii4U( 0x55 );
+ const TUint8 ascii4B( 0x42 );
+ EUNIT_ASSERT_DESC( ascii4S == retValue[0] && ascii4T == retValue[1] &&
+ ascii4U == retValue[2] && ascii4B == retValue[3],
+ "Getting device property (DevName) failed, wrong data!" );
+ }
+
+// ---------------------------------------------------------
+// Fetches the haptics status using the getter method.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetHapticsStatus()
+ {
+ MHWRMHapticsObserver::THWRMHapticsStatus status = iHaptics->HapticsStatus();
+ EUNIT_ASSERT_DESC( (status == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable),
+ "Invalid haptics status received!" );
+ }
+
+// ---------------------------------------------------------
+// Fetches the haptics status using the observer.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ObserveHapticsStatus()
+ {
+ // create callback instance
+ THapticsStatusCallback callback( this );
+
+ // create haptics client with observer
+ CHWRMHaptics* haptics = CHWRMHaptics::NewL( &callback, NULL );
+
+ // wait for the callback to be called
+ iWait.Start();
+
+ // check status (since execution of this method continues, the status
+ // has been updated in the callback)
+ EUNIT_ASSERT_DESC( (callback.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ delete haptics;
+ }
+
+// ---------------------------------------------------------
+// Fetches status values, when one client is reserving
+// haptics.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetHapticsStatusWithReservations()
+ {
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // make reservation using the first client
+ haptics1->ReserveHapticsL();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = haptics1->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = haptics2->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation
+ haptics1->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Status value observing, when one client is reserving
+// haptics.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ObserveHapticsStatusWithReservations()
+ {
+ // create callback instances
+ THapticsStatusCallback callback1( this );
+ THapticsStatusCallback callback2( this );
+
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &callback1, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &callback2, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // wait for the initial notifications to arrive
+ iWait.Start();
+ iWait.Start();
+
+ // make reservation using the first client
+ haptics1->ReserveHapticsL();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = callback2.Status();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation
+ haptics1->ReleaseHaptics();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ status2 = callback2.Status();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Haptics status, when several clients are making
+// reservations with equal priorities.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetHapticsStatusWithSeveralReservations()
+ {
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // make reservation using both clients (second should become suspended)
+ haptics1->ReserveHapticsL();
+ haptics2->ReserveHapticsL();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = haptics1->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = haptics2->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusSuspended ),
+ "Invalid haptics status received!" );
+
+ // release reservation of the first client
+ haptics1->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // release reservation of the second client
+ haptics2->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Haptics status using observation, when several clients
+// are making reservations with equal priorities.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ObserveHapticsStatusWithSeveralReservations()
+ {
+ // create callback instances
+ THapticsStatusCallback callback1( this );
+ THapticsStatusCallback callback2( this );
+
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &callback1, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &callback2, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // wait for the initial notifications to arrive
+ iWait.Start();
+ iWait.Start();
+
+ // make reservation using the first client
+ haptics1->ReserveHapticsL();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = callback2.Status();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // make reservation using the second client
+ haptics2->ReserveHapticsL();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ status2 = callback2.Status();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusSuspended ),
+ "Invalid haptics status received!" );
+
+ // release first client's reservation
+ haptics1->ReleaseHaptics();
+
+ // wait for the callback to be called (both clients should
+ // receive new status)
+ iWait.Start();
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = callback1.Status();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ status2 = callback2.Status();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // release second client's reservation
+ haptics2->ReleaseHaptics();
+
+ // wait for the callback to be called (only first client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ status1 = callback1.Status();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Several clients with one making a reservation --> tests
+// that all other clients become "reserved".
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_GetHapticsStatusWithSeveralClientsOneReservation()
+ {
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics3 );
+
+ // reservation using first client
+ haptics1->ReserveHapticsL();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = haptics1->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = haptics2->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status3 = haptics3->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation
+ haptics1->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status3 = haptics3->HapticsStatus();
+ EUNIT_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics3 );
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Several clients with one making a reservation --> tests
+// that all other clients become "reserved" using observers.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ObserveHapticsStatusWithSeveralClientsOneReservations()
+ {
+ // create callback instances
+ THapticsStatusCallback callback1( this );
+ THapticsStatusCallback callback2( this );
+ THapticsStatusCallback callback3( this );
+
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &callback1, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &callback2, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( &callback3, NULL );
+ CleanupStack::PushL( haptics3 );
+
+ // wait for the initial notifications to arrive
+ iWait.Start();
+ iWait.Start();
+ iWait.Start();
+
+ // reservation using first client
+ haptics1->ReserveHapticsL();
+
+ // wait for the notifications for client2 and client3
+ iWait.Start();
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = callback2.Status();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status3 = callback3.Status();
+ EUNIT_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation using first client
+ haptics1->ReleaseHaptics();
+
+ // wait for the notifications for client2 and client3
+ iWait.Start();
+ iWait.Start();
+
+ // check client status values
+ status2 = callback2.Status();
+ EUNIT_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status3 = callback3.Status();
+ EUNIT_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics3 );
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+// ---------------------------------------------------------
+// Creates streaming effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_CreateStreamingEffect()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ TInt effectHandle;
+ TInt err = iHaptics->CreateStreamingEffect( effectHandle );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Creating streaming effect failed!" );
+ EUNIT_ASSERT_DESC( effectHandle, "Creating streaming effect returned empty effect handle!" );
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample using synchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayStreamingSample()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // valid sized sample 0 handle 0 offset
+ TInt err = iHaptics->PlayStreamingSample( 0, validStreamSample );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Play streaming sample failed!" );
+
+ // normal sample MIN handle MIN offset
+ err = iHaptics->PlayStreamingSample( INT_MIN, validStreamSample );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Play streaming sample failed!" );
+
+ // normal sample MAX handle MAX offset
+ err = iHaptics->PlayStreamingSample( INT_MAX, validStreamSample );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Play streaming sample failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ err = iHaptics->PlayStreamingSample( INT_MAX, tooBigStreamSample );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Play streaming sample (over sized sample), wrong error code" );
+
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ err = iHaptics->PlayStreamingSample( INT_MIN, validStreamSample );
+ EUNIT_ASSERT_DESC( ( err == KErrInUse ), "Play streaming sample (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample using asynchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayStreamingSampleAsync()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // normal sample 0 handle 0 offset
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayStreamingSample( 0, validStreamSample, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample failed!" );
+
+ // normal sample MIN handle MIN offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MIN, validStreamSample, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample failed!" );
+
+ // normal sample MAX handle MAX offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MAX, validStreamSample, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MAX, tooBigStreamSample, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrArgument ), "Play streaming sample (over sized sample), wrong error code" );
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MIN, validStreamSample, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse ), "Play streaming sample (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample with offset using
+// synchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayStreamingSampleWithOffset()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // valid sized sample 0 handle 0 offset
+ TInt err = iHaptics->PlayStreamingSampleWithOffset( 0, validStreamSample, 0 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Play streaming sample with offset failed!" );
+
+ // normal sample MIN handle MIN offset
+ err = iHaptics->PlayStreamingSampleWithOffset( INT_MIN, validStreamSample, INT_MIN );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Play streaming sample with offset failed!" );
+
+ // normal sample MAX handle MAX offset
+ err = iHaptics->PlayStreamingSampleWithOffset( INT_MAX, validStreamSample, INT_MAX );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Play streaming sample with offset failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ err = iHaptics->PlayStreamingSampleWithOffset( INT_MAX, tooBigStreamSample, INT_MAX );
+ EUNIT_ASSERT_DESC( (err == KErrArgument), "Play streaming sample with offset (over sized sample), wrong error code" );
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ err = iHaptics->PlayStreamingSample( INT_MIN, validStreamSample );
+ EUNIT_ASSERT_DESC( ( err == KErrInUse ), "Play streaming sample (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample with offset using
+// asynchronous API call.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_PlayStreamingSampleWithOffsetAsync()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // normal sample 0 handle 0 offset
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( 0, validStreamSample, 0, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample with offset failed!" );
+
+ // normal sample MIN handle MIN offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( INT_MIN, validStreamSample, INT_MIN, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample with offset failed!" );
+
+ // normal sample MAX handle MAX offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( INT_MAX, validStreamSample, INT_MAX, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample with offset failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( INT_MAX, tooBigStreamSample, INT_MAX, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrArgument ), "Play streaming sample with offset (over sized sample), wrong error code" );
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MIN, validStreamSample, status );
+ User::WaitForRequest( status );
+ EUNIT_ASSERT_DESC( (status.Int() == KErrInUse ), "Play streaming sample with offset (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ }
+
+// ---------------------------------------------------------
+// Destroys streaming effect.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_DestroyStreamingEffect()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // zero handle
+ TInt err = iHaptics->DestroyStreamingEffect( 0 );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Destroying streaming effect with handle 0 failed!" );
+
+ // minimum handle value
+ err = iHaptics->DestroyStreamingEffect( INT_MIN );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Destroying streaming effect with handle INT_MIN failed!" );
+
+ // maximum handle value
+ err = iHaptics->DestroyStreamingEffect( INT_MAX );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Destroying streaming effect with handle INT_MAX failed!" );
+ }
+
+
+// ---------------------------------------------------------
+// Fetches actuator state using the observer.
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ObserveActuatorStatus()
+ {
+ // Create 2 actuator status observer instances
+ TActuatorStatusCallback callback1( this );
+ TActuatorStatusCallback callback2( this );
+
+ // create 1st haptics client with actuator observer
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, &callback1 );
+ CleanupStack::PushL( haptics1 );
+
+ //Open actuator
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ // wait for the callback to be called
+ iWait.Start();
+
+ // check actuator state (since execution of this method continues, the state
+ // has been updated in the callback)
+ EUNIT_ASSERT_DESC( (callback1.Status(EHWRMLogicalActuatorAny) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator state received!" );
+
+ // create 2nd haptics client with actuator observer
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, &callback2 );
+ CleanupStack::PushL( haptics2 );
+
+ //Open actuator
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+
+ // wait for the callback to be called
+ iWait.Start();
+
+ // check actuator state (since execution of this method continues, the state
+ // has been updated in the callback)
+ EUNIT_ASSERT_DESC( (callback2.Status(EHWRMLogicalActuatorDevice) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator state received!" );
+
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+void MT_HapticsClient::T_ObserveActuatorStatusAndHapticsStatus()
+ {
+ // Create 3 actuator status observers.
+ TActuatorStatusCallback actuatorCallback1( this );
+ TActuatorStatusCallback actuatorCallback2( this );
+ TActuatorStatusCallback actuatorCallback3( this );
+
+ // Create 3 haptics status observers.
+ THapticsStatusCallback hapticsCallback1( this );
+ THapticsStatusCallback hapticsCallback2( this );
+ THapticsStatusCallback hapticsCallback3( this );
+
+ // create 1st haptics client with observers
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &hapticsCallback1, &actuatorCallback1 );
+ CleanupStack::PushL( haptics1 );
+
+ //Open actuator
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ // wait for the actuator status callback to be called
+ iWait.Start();
+
+ // check actuator status (since execution of this method continues, the status
+ // has been updated in the callback)
+ EUNIT_ASSERT_DESC( (actuatorCallback1.Status(EHWRMLogicalActuatorDevice) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator status received!" );
+ // check haptics status
+ EUNIT_ASSERT_DESC( ( hapticsCallback1.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ haptics1->ReserveHapticsL();
+
+
+ // create 2nd and 3rd haptics clients with observers
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &hapticsCallback2, &actuatorCallback2 );
+ CleanupStack::PushL( haptics2 );
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( &hapticsCallback3, &actuatorCallback3 );
+ CleanupStack::PushL( haptics3 );
+
+ // reserve haptics for 2nd client
+ haptics2->ReserveHapticsL();
+
+ //Open actuator
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ TRAP( err, haptics3->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ EUNIT_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ iWait.Start();
+ iWait.Start();
+ // wait for the actuator status callback to be called
+ iWait.Start();
+ iWait.Start();
+
+ // check haptics status (since execution of this method continues, the status
+ // has been updated in the callback)
+ EUNIT_ASSERT_DESC( ( hapticsCallback2.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusSuspended ),
+ "Invalid haptics status received!" );
+ EUNIT_ASSERT_DESC( ( hapticsCallback3.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ // check actuator status
+ EUNIT_ASSERT_DESC( (actuatorCallback2.Status(EHWRMLogicalActuatorAny) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator status received!" );
+ EUNIT_ASSERT_DESC( (actuatorCallback3.Status(EHWRMLogicalActuatorDevice) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator status received!" );
+
+ // release haptics
+ haptics1->ReleaseHaptics();
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ iWait.Start();
+
+ EUNIT_ASSERT_DESC( ( hapticsCallback1.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ EUNIT_ASSERT_DESC( ( hapticsCallback2.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+
+ // release haptics
+ haptics2->ReleaseHaptics();
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ iWait.Start();
+
+ EUNIT_ASSERT_DESC( ( hapticsCallback1.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ EUNIT_ASSERT_DESC( ( hapticsCallback3.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics3 );
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ }
+
+void MT_HapticsClient::T_PluginMgrTransTimerExpires()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ _LIT8 ( KTestPluginMgrTransTimerExpires, "KTestPluginMgrTransTimerExpires" );
+ // set property with the TestCase ID string, so that the test plug-in doesn't send the response for the current
+ // transaction, till the Plug-in manager Transction timer expires.
+ // Out-come: Plug-in manager should hanlde this scenario and send cancel transaction command to test plug-in.
+ TInt err = iHaptics->SetDeviceProperty(
+ CHWRMHaptics::EHWRMHapticsLicensekey,
+ KTestPluginMgrTransTimerExpires );
+ EUNIT_ASSERT_DESC( (err == KErrTimedOut), "Setting device property (license key) failed!" );
+ }
+
+
+
+// - EUnit test table -------------------------------------------------------
+
+EUNIT_BEGIN_TEST_TABLE(
+ MT_HapticsClient,
+ "Haptics Client Module Tests",
+ "MODULE" )
+
+// 1,01
+EUNIT_TEST(
+ "Create and destroy",
+ "HapticsClient",
+ "NewL",
+ "FUNCTIONALITY",
+ Dummy, T_CreateAndDeleteL, Dummy)
+
+// 1,02
+EUNIT_TEST(
+ "Several sessions",
+ "HapticsClient",
+ "NewL",
+ "FUNCTIONALITY",
+ Dummy, T_SeveralSessionsL, Dummy)
+
+// 1,03
+EUNIT_TEST(
+ "Consecutive sessions",
+ "HapticsClient",
+ "NewL",
+ "FUNCTIONALITY",
+ Dummy, T_ConsecutiveSessionsL, Dummy)
+
+// 1,04
+EUNIT_TEST(
+ "Supported actuators",
+ "HapticsClient",
+ "SupportedActuators",
+ "FUNCTIONALITY",
+ SetupL, T_SupportedActuators, Teardown)
+
+// 1,05
+EUNIT_TEST(
+ "Open supported actuator",
+ "HapticsClient",
+ "OpenActuatorL",
+ "FUNCTIONALITY",
+ SetupL, T_OpenSupportedActuator, Teardown)
+
+// 1,06
+EUNIT_TEST(
+ "Open unsupported actuator",
+ "HapticsClient",
+ "OpenActuatorL",
+ "FUNCTIONALITY",
+ SetupL, T_OpenNotSupportedActuator, Teardown)
+
+// 1,07
+EUNIT_TEST(
+ "Open all actuators",
+ "HapticsClient",
+ "OpenActuatorL",
+ "FUNCTIONALITY",
+ SetupL, T_OpenAllActuators, Teardown)
+
+// 1,08
+EUNIT_TEST(
+ "2 clients open actuators",
+ "HapticsClient",
+ "OpenActuatorL",
+ "FUNCTIONALITY",
+ Dummy, T_SeveralClientsWithOpenActuatorsL, Dummy)
+
+// 1,09
+EUNIT_TEST(
+ "Play MagSweep synch (data)",
+ "HapticsClient",
+ "PlayMagSweepEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayMagSweepEffectSynchronous, Teardown)
+
+// 1,10
+EUNIT_TEST(
+ "Play MagSweep asynch (data)",
+ "HapticsClient",
+ "PlayMagSweepEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayMagSweepEffectAsynchronous, Teardown)
+
+// 1,11
+EUNIT_TEST(
+ "Play Periodic synch (data)",
+ "HapticsClient",
+ "PlayPeriodicEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayPeriodicEffectSynchronous, Teardown)
+
+// 1,12
+EUNIT_TEST(
+ "Play Periodic asynch (data)",
+ "HapticsClient",
+ "PlayPeriodicEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayPeriodicEffectAsynchronous, Teardown)
+
+// 1,13
+EUNIT_TEST(
+ "Play IVT synch (data)",
+ "HapticsClient",
+ "PlayEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectWithDirectDataSynchronous, Teardown)
+
+// 1,14
+EUNIT_TEST(
+ "Play IVT asynch (data)",
+ "HapticsClient",
+ "PlayEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectWithDirectDataAsynchronous, Teardown)
+
+// 1,15
+EUNIT_TEST(
+ "Repeat IVT synch (data)",
+ "HapticsClient",
+ "PlayEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatWithDirectDataSynchronous, Teardown)
+
+// 1,16
+EUNIT_TEST(
+ "Repeat IVT asynch (data)",
+ "HapticsClient",
+ "PlayEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatWithDirectDataAsynchronous, Teardown)
+
+// 1,17
+EUNIT_TEST(
+ "Get effect state",
+ "HapticsClient",
+ "GetEffectState",
+ "FUNCTIONALITY",
+ SetupL, T_GetEffectState, Teardown)
+
+// 1,18
+EUNIT_TEST(
+ "Repeat IVT synch (data - non-timeline)",
+ "HapticsClient",
+ "PlayEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayNonTimelineIVTEffectRepeatWithDirectDataSynchronous, Teardown)
+
+// 1,19
+EUNIT_TEST(
+ "Repeat IVT asynch (data - non-timeline)",
+ "HapticsClient",
+ "PlayEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayNonTimelineIVTEffectRepeatWithDirectDataAsynchronous, Teardown)
+
+// 1,20
+EUNIT_TEST(
+ "Zero-repeat IVT synch (data)",
+ "HapticsClient",
+ "PlayEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueSynchronous, Teardown)
+
+// 1,21
+EUNIT_TEST(
+ "Zero-repeat IVT asynch (data)",
+ "HapticsClient",
+ "PlayEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueAsynchronous, Teardown)
+
+// 1,22
+EUNIT_TEST(
+ "Load IVT data",
+ "HapticsClient",
+ "LoadData",
+ "FUNCTIONALITY",
+ SetupL, T_LoadIVTData, Teardown)
+
+// 1,23
+EUNIT_TEST(
+ "Delete IVT data",
+ "HapticsClient",
+ "DeleteEffectData",
+ "FUNCTIONALITY",
+ SetupL, T_DeleteIVTData, Teardown)
+
+// 1,24
+EUNIT_TEST(
+ "Delete All IVT data",
+ "HapticsClient",
+ "DeleteAllEffectData",
+ "FUNCTIONALITY",
+ SetupL, T_DeleteAllIVTData, Teardown)
+
+// 1,35
+EUNIT_TEST(
+ "Load and delete multiple",
+ "HapticsClient",
+ "LoadAndDeleteEffectData",
+ "FUNCTIONALITY",
+ SetupL, T_LoadAndDeleteIVTData, Teardown)
+
+// 1,36
+EUNIT_TEST(
+ "Load and delete mixed",
+ "HapticsClient",
+ "LoadAndDeleteEffectDataMixed",
+ "FUNCTIONALITY",
+ SetupL, T_LoadAndDeleteIVTDataMixed, Teardown)
+
+// 1,37
+EUNIT_TEST(
+ "Load, Del, Play sync",
+ "HapticsClient",
+ "LoadDeletePlaySync",
+ "FUNCTIONALITY",
+ SetupL, T_LoadDeletePlaySync, Teardown)
+
+// 1,38
+EUNIT_TEST(
+ "Load, Del, Play async",
+ "HapticsClient",
+ "LoadDeletePlayAsync",
+ "FUNCTIONALITY",
+ SetupL, T_LoadDeletePlayAsync, Teardown)
+
+// 1,39
+EUNIT_TEST(
+ "Load, Del, Repeat sync",
+ "HapticsClient",
+ "LoadDeletePlayRepeatSync",
+ "FUNCTIONALITY",
+ SetupL, T_LoadDeletePlayRepeatSync, Teardown)
+
+// 1,40
+EUNIT_TEST(
+ "Load, Del, Repeat async",
+ "HapticsClient",
+ "LoadDeletePlayRepeatAsync",
+ "FUNCTIONALITY",
+ SetupL, T_LoadDeletePlayRepeatAsync, Teardown)
+
+// 1,25
+EUNIT_TEST(
+ "Play loaded IVT synch",
+ "HapticsClient",
+ "PlayIVTEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectWithLoadedDataSynchronous, Teardown)
+
+// 1,26
+EUNIT_TEST(
+ "Play loaded IVT asynch",
+ "HapticsClient",
+ "PlayIVTEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectWithLoadedDataAsynchronous, Teardown)
+
+// 1,27
+EUNIT_TEST(
+ "Repeat loaded IVT synch",
+ "HapticsClient",
+ "PlayIVTEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatWithLoadedDataSynchronous, Teardown)
+
+// 1,28
+EUNIT_TEST(
+ "Repeat loaded IVT asynch",
+ "HapticsClient",
+ "PlayIVTEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatWithLoadedDataAsynchronous, Teardown)
+
+// 1,29
+EUNIT_TEST(
+ "Load multiple IVT-data",
+ "HapticsClient",
+ "LoadIVTData",
+ "FUNCTIONALITY",
+ SetupL, T_LoadMultipleIVTData, Teardown)
+
+// 1,30
+EUNIT_TEST(
+ "Play from multiple IVT-data",
+ "HapticsClient",
+ "PlayIVTEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectsFromMultipleIVTDataSynchronous, Teardown)
+
+// 1,31
+EUNIT_TEST(
+ "Play from multiple IVT-data",
+ "HapticsClient",
+ "PlayIVTEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectsFromMultipleIVTDataAsynchronous, Teardown)
+
+// 1,32
+EUNIT_TEST(
+ "Play repeat from multiple IVT-data",
+ "HapticsClient",
+ "PlayIVTEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatFromMultipleIVTDataSynchronous, Teardown)
+
+// 1,33
+EUNIT_TEST(
+ "Play repeat from multiple IVT-data",
+ "HapticsClient",
+ "PlayIVTEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_PlayIVTEffectRepeatFromMultipleIVTDataAsynchronous, Teardown)
+
+// 1,34
+EUNIT_TEST(
+ "Status conversions",
+ "HapticsClient",
+ "PlayIVTEffectRepeat",
+ "FUNCTIONALITY",
+ SetupL, T_VibeStatusToS60StatusConversions, Teardown)
+
+// 1,48
+EUNIT_TEST(
+ "Reserve and release",
+ "HapticsClient",
+ "ReserveHapticsL",
+ "FUNCTIONALITY",
+ SetupL, T_ReserveAndReleaseHaptics, Teardown)
+
+// 1,49
+EUNIT_TEST(
+ "Reserve several times",
+ "HapticsClient",
+ "ReserveHapticsL",
+ "FUNCTIONALITY",
+ SetupL, T_ReserveHapticsSeveralTimes, Teardown)
+
+// 1,50
+EUNIT_TEST(
+ "Reserve, no release",
+ "HapticsClient",
+ "ReleaseHaptics",
+ "FUNCTIONALITY",
+ Dummy, T_ReserveHapticsNoReleaseL, Dummy)
+
+// 1,51
+EUNIT_TEST(
+ "Release, no reserve",
+ "HapticsClient",
+ "ReleaseHaptics",
+ "FUNCTIONALITY",
+ SetupL, T_ReleaseHapticsWithoutReservingFirst, Teardown)
+
+// 1,52
+EUNIT_TEST(
+ "Reserve forceNoCoe",
+ "HapticsClient",
+ "ReserveHapticsL",
+ "FUNCTIONALITY",
+ SetupL, T_ReserveNoAutomaticFocusNotTrusted, Teardown)
+
+// 1,53
+EUNIT_TEST(
+ "Reserve reserved higher",
+ "HapticsClient",
+ "ReserveHapticsL",
+ "FUNCTIONALITY",
+ Dummy, T_ReserveAlreadyReservedHigherL, Dummy)
+
+// 1,54
+EUNIT_TEST(
+ "Reserve reserved lower",
+ "HapticsClient",
+ "ReserveHapticsL",
+ "FUNCTIONALITY",
+ Dummy, T_ReserveAlreadyReservedLowerL, Dummy)
+
+// 1,55
+EUNIT_TEST(
+ "Play when reserved",
+ "HapticsClient",
+ "ReserveHapticsL",
+ "FUNCTIONALITY",
+ SetupL, T_PlayWhenReservedL, Teardown)
+
+// 1,41
+EUNIT_TEST(
+ "Get effect count",
+ "HapticsClient",
+ "GetIVTEffectCount",
+ "FUNCTIONALITY",
+ SetupL, T_GetIVTEffectCount, Teardown)
+
+// 1,42
+EUNIT_TEST(
+ "Get effect duration",
+ "HapticsClient",
+ "GetIVTEffectDuration",
+ "FUNCTIONALITY",
+ SetupL, T_GetIVTEffectDuration, Teardown)
+
+// 1,43
+EUNIT_TEST(
+ "Get effect index from name",
+ "HapticsClient",
+ "GetEffectIndexFromName",
+ "FUNCTIONALITY",
+ SetupL, T_GetIVTEffectIndexFromName, Teardown)
+
+// 1,44
+EUNIT_TEST(
+ "Get effect type",
+ "HapticsClient",
+ "GetEffectType",
+ "FUNCTIONALITY",
+ SetupL, T_GetIVTEffectType, Teardown)
+
+// 1,45
+EUNIT_TEST(
+ "Get effect name",
+ "HapticsClient",
+ "GetEffectName",
+ "FUNCTIONALITY",
+ SetupL, T_GetIVTEffectName, Teardown)
+
+// 1,46
+EUNIT_TEST(
+ "Get MagSweep effect definition",
+ "HapticsClient",
+ "GetMagSweepEffectDefinition",
+ "FUNCTIONALITY",
+ SetupL, T_GetIVTMagSweepEffectDefinition, Teardown)
+
+// 1,47
+EUNIT_TEST(
+ "Get Periodic effect definition",
+ "HapticsClient",
+ "GetPeriodicEffectDefinition",
+ "FUNCTIONALITY",
+ SetupL, T_GetIVTPeriodicEffectDefinition, Teardown)
+
+// 1,56
+EUNIT_TEST(
+ "Create and destroy asynchronous",
+ "HapticsClient",
+ "NewL",
+ "FUNCTIONALITY",
+ Dummy, T_CreateAndDeleteAsynchronousL, Dummy)
+
+// 1,57
+EUNIT_TEST(
+ "Several sessions asynchronous",
+ "HapticsClient",
+ "NewL",
+ "FUNCTIONALITY",
+ Dummy, T_SeveralSessionsAsynchronousL, Dummy)
+
+// 1,58
+EUNIT_TEST(
+ "Consecutive sessions asynchronous",
+ "HapticsClient",
+ "NewL",
+ "FUNCTIONALITY",
+ Dummy, T_ConsecutiveSessionsAsynchronousL, Dummy)
+
+// 1,59
+EUNIT_TEST(
+ "Constant getters",
+ "HapticsClient",
+ "InfiniteRepeat", // and others..
+ "FUNCTIONALITY",
+ SetupL, T_ConstantGetters, Teardown)
+
+// 1,60
+EUNIT_TEST(
+ "Pause effect",
+ "HapticsClient",
+ "PausePlayingEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PauseEffect, Teardown)
+
+// 1,61
+EUNIT_TEST(
+ "Resume effect",
+ "HapticsClient",
+ "ResumePausedEffect",
+ "FUNCTIONALITY",
+ SetupL, T_ResumeEffect, Teardown)
+
+// 1,62
+EUNIT_TEST(
+ "Stop effect",
+ "HapticsClient",
+ "StopPlayingEffect",
+ "FUNCTIONALITY",
+ SetupL, T_StopEffect, Teardown)
+
+// 1,63
+EUNIT_TEST(
+ "Stop all effects",
+ "HapticsClient",
+ "StopAllPlayingEffects",
+ "FUNCTIONALITY",
+ SetupL, T_StopAllEffects, Teardown)
+
+// 1,64
+EUNIT_TEST(
+ "Play, pause, resume, stop",
+ "HapticsClient",
+ "StopPlayingEffect",
+ "FUNCTIONALITY",
+ SetupL, T_PlayPauseResumeStop, Teardown)
+
+// 1,65
+EUNIT_TEST(
+ "Modify playing magsweep effect synchronous",
+ "HapticsClient",
+ "ModifyPlayingMagSweepEffect",
+ "FUNCTIONALITY",
+ SetupL, T_ModifyMagSweepEffectSynchronous, Teardown)
+
+// 1,66
+EUNIT_TEST(
+ "Modify playing magsweep effect asynchronous",
+ "HapticsClient",
+ "ModifyPlayingMagSweepEffect",
+ "FUNCTIONALITY",
+ SetupL, T_ModifyMagSweepEffectAsynchronous, Teardown)
+
+// 1,67
+EUNIT_TEST(
+ "Modify playing periodic effect synchronous",
+ "HapticsClient",
+ "ModifyPlayingPeriodicEffect",
+ "FUNCTIONALITY",
+ SetupL, T_ModifyPeriodicEffectSynchronous, Teardown)
+
+// 1,68
+EUNIT_TEST(
+ "Modify playing periodic effect asynchronous",
+ "HapticsClient",
+ "ModifyPlayingPeriodicEffect",
+ "FUNCTIONALITY",
+ SetupL, T_ModifyPeriodicEffectAsynchronous, Teardown)
+
+// 1,69
+EUNIT_TEST(
+ "Get device property of TInt value",
+ "HapticsClient",
+ "GetDeviceProperty_TInt_TInt",
+ "FUNCTIONALITY",
+ SetupL, T_GetDeviceProperty_TInt_TInt, Teardown)
+
+// 1,70
+EUNIT_TEST(
+ "Get device property of TDesC value",
+ "HapticsClient",
+ "GetDeviceProperty_TInt_TDesC",
+ "FUNCTIONALITY",
+ SetupL, T_GetDeviceProperty_TInt_TDesC, Teardown)
+
+// 1,71
+EUNIT_TEST(
+ "Set device property of TInt value",
+ "HapticsClient",
+ "SetDeviceProperty_TInt_TInt",
+ "FUNCTIONALITY",
+ SetupL, T_SetDeviceProperty_TInt_TInt, Teardown)
+
+// 1,72
+EUNIT_TEST(
+ "Set device property of TDesC value",
+ "HapticsClient",
+ "SetDeviceProperty_TInt_TDesC",
+ "FUNCTIONALITY",
+ SetupL, T_SetDeviceProperty_TInt_TDesC, Teardown)
+
+// 1,73
+EUNIT_TEST(
+ "Get device capability of TInt value",
+ "HapticsClient",
+ "GetDeviceCapability_TInt_TInt",
+ "FUNCTIONALITY",
+ SetupL, T_GetDeviceCapability_TInt_TInt, Teardown)
+
+// 1,74
+EUNIT_TEST(
+ "Get device capability of TDesC value",
+ "HapticsClient",
+ "GetDeviceCapability_TInt_TDesC",
+ "FUNCTIONALITY",
+ SetupL, T_GetDeviceCapability_TInt_TDesC, Teardown)
+
+// 1,75
+EUNIT_TEST(
+ "Fetch status",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ SetupL, T_GetHapticsStatus, Teardown)
+
+// 1,76
+EUNIT_TEST(
+ "Observe status",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ Dummy, T_ObserveHapticsStatus, Dummy)
+
+// 1,77
+EUNIT_TEST(
+ "Status, reservation",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ Dummy, T_GetHapticsStatusWithReservations, Dummy)
+
+// 1,78
+EUNIT_TEST(
+ "Status, observe, reservation",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ Dummy, T_ObserveHapticsStatusWithReservations, Dummy)
+
+// 1,79
+EUNIT_TEST(
+ "Status, 2 reservations",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ Dummy, T_GetHapticsStatusWithSeveralReservations, Dummy)
+
+// 1,80
+EUNIT_TEST(
+ "Status, observe, 2 reservation",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ Dummy, T_ObserveHapticsStatusWithSeveralReservations, Dummy)
+
+// 1,81
+EUNIT_TEST(
+ "Status, many clients",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ Dummy, T_GetHapticsStatusWithSeveralClientsOneReservation, Dummy)
+
+// 1,82
+EUNIT_TEST(
+ "Status, observer, many clients",
+ "HapticsClient",
+ "HapticsStatus",
+ "FUNCTIONALITY",
+ Dummy, T_ObserveHapticsStatusWithSeveralClientsOneReservations, Dummy)
+
+
+// 1,83
+EUNIT_TEST(
+ "Create streaming effect",
+ "HapticsClient",
+ "CreateStreamingEffect",
+ "FUNCTIONALITY",
+ SetupL, T_CreateStreamingEffect, Teardown)
+
+// 1,84
+EUNIT_TEST(
+ "Play streaming sample",
+ "HapticsClient",
+ "PlayStreamingSample",
+ "FUNCTIONALITY",
+ SetupL, T_PlayStreamingSample, Teardown)
+
+// 1,85
+EUNIT_TEST(
+ "Play streaming sample, async",
+ "HapticsClient",
+ "PlayStreamingSample",
+ "FUNCTIONALITY",
+ SetupL, T_PlayStreamingSampleAsync, Teardown)
+
+// 1,86
+EUNIT_TEST(
+ "Play streaming sample with offset",
+ "HapticsClient",
+ "PlayStreamingSampleWithOffset",
+ "FUNCTIONALITY",
+ SetupL, T_PlayStreamingSampleWithOffset, Teardown)
+
+// 1,87
+EUNIT_TEST(
+ "Play streaming sample with offset, async",
+ "HapticsClient",
+ "PlayStreamingSampleWithOffset",
+ "FUNCTIONALITY",
+ SetupL, T_PlayStreamingSampleWithOffsetAsync, Teardown)
+
+// 1,88
+EUNIT_TEST(
+ "Destroy streaming effect",
+ "HapticsClient",
+ "DestroyStreamingEffect",
+ "FUNCTIONALITY",
+ SetupL, T_DestroyStreamingEffect, Teardown)
+
+// 1,89
+EUNIT_TEST(
+ "Actuator status",
+ "HapticsClient",
+ "ActuatorStatus",
+ "FUNCTIONALITY",
+ SetupL, T_ObserveActuatorStatus, Teardown)
+
+// 1,89
+EUNIT_TEST(
+ "Actuator/Haptics status",
+ "HapticsClient",
+ "ActuatorStatus",
+ "FUNCTIONALITY",
+ SetupL, T_ObserveActuatorStatusAndHapticsStatus, Teardown)
+
+// 1,90
+EUNIT_TEST(
+ "Plugin Manager Timer Expires",
+ "HapticsClient",
+ "ActuatorStatus",
+ "FUNCTIONALITY",
+ SetupL, T_PluginMgrTransTimerExpires, Teardown)
+
+
+#if 0
+// Copy this as basis for new ones..
+EUNIT_TEST(
+ "",
+ "HapticsClient",
+ "",
+ "FUNCTIONALITY",
+ SetupL, Dummy, Teardown)
+#endif
+
+
+EUNIT_END_TEST_TABLE
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/mt_hapticsclient/mt_hapticsclient.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,400 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifndef __MT_HAPTICSCLIENT_H__
+#define __MT_HAPTICSCLIENT_H__
+
+// INCLUDES
+#include <Digia/EUnit/CEUnitTestSuiteClass.h>
+#include <Digia/EUnit/EUnitDecorators.h>
+#include <hwrmhaptics.h>
+
+class MT_HapticsClient;
+
+/**
+ * Callback class for haptics status observation.
+ */
+NONSHARABLE_CLASS( THapticsStatusCallback ) : public MHWRMHapticsObserver
+ {
+public:
+
+ /**
+ * C++ constructor.
+ */
+ THapticsStatusCallback( MT_HapticsClient* aMTCallback );
+
+ /**
+ * Destructor.
+ */
+ ~THapticsStatusCallback();
+
+ /**
+ * Returns the last received status.
+ *
+ * @return Last status value.
+ */
+ MHWRMHapticsObserver::THWRMHapticsStatus Status();
+
+ /**
+ * Starts a new wait loop under the current active scheduler.
+ * This method can be used in module tests to wait for the
+ * notification to be received. When the notification is
+ * received (i.e. callback is called by haptics), the waiting
+ * is stopped and the execution continues whereever this method
+ * was called.
+ */
+ void WaitForNotification();
+
+public: // from MHWRMHapticsObserver
+
+ virtual void HapticsStatusChangedL( THWRMHapticsStatus aStatus );
+ virtual void EffectCompletedL( TInt aError, TInt aEffectHandle );
+
+private:
+
+ /**
+ * Last received haptics status through status observation.
+ */
+ MHWRMHapticsObserver::THWRMHapticsStatus iHapticsStatus;
+
+ /**
+ * Callback which is notified, when a status has been received.
+ */
+ MT_HapticsClient* iMTCallback;
+ };
+
+
+/**
+ * Callback class for actuator status observation.
+ */
+NONSHARABLE_CLASS( TActuatorStatusCallback ) : public MHWRMHapticsActuatorObserver
+ {
+public:
+
+ /**
+ * C++ constructor.
+ */
+ TActuatorStatusCallback( MT_HapticsClient* aMTCallback );
+
+ /**
+ * Destructor.
+ */
+ ~TActuatorStatusCallback();
+
+ /**
+ * Returns the last received state.
+ *
+ * @return Last status value.
+ */
+ MHWRMHapticsActuatorObserver::THWRMActuatorEvents Status( THWRMLogicalActuators aActuator );
+
+ /**
+ * Starts a new wait loop under the current active scheduler.
+ * This method can be used in module tests to wait for the
+ * notification to be received. When the notification is
+ * received (i.e. callback is called by haptics), the waiting
+ * is stopped and the execution continues whereever this method
+ * was called.
+ */
+ void WaitForNotification();
+
+public: // from MHWRMHapticsActuatorObserver
+
+ virtual void ActuatorEventL( THWRMActuatorEvents aEvent,
+ THWRMLogicalActuators aActuator );
+
+private:
+
+ /**
+ * Last received actuator status through state observation.
+ */
+ RArray<TInt> iActuatorStatus;
+
+ /**
+ * Callback which is notified, when a state has been received.
+ */
+ MT_HapticsClient* iMTCallback;
+ };
+
+/**
+ * Class for making async play-with-filehandle calls on behalf of the
+ * MT_HapticsClient
+ */
+NONSHARABLE_CLASS( MT_HapticsTestAsyncPlaySender ) : public CActive
+ {
+public:
+
+ /**
+ * Constructor
+ *
+ * @param aUi Pointer to the test appl UI object.
+ */
+ MT_HapticsTestAsyncPlaySender( MT_HapticsClient* aMTCallback );
+
+ /**
+ * Destructor
+ */
+ virtual ~MT_HapticsTestAsyncPlaySender();
+
+ /**
+ * Method for fileHandle type playing of effects repeatedly in asynch mode
+ *
+ * @param aHaptics Pointer to the haptics interface object.
+ * @param aFileHandle Handle for the effect data buffer from which to
+ * play the effects.
+ * @param aEffectIndex Index of the effect that is being played.
+ * @param aRepeat Number of repeats.
+ * @param aEffectHandle Out-parameter to which the handle for the played
+ * effect is returned.
+ */
+ void PlayRepeat( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TUint8 aRepeat,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus );
+
+ /**
+ * Method for fileHandle type playing of effects in asynch mode
+ *
+ * @param aHaptics Pointer to the haptics interface object.
+ * @param aFileHandle Handle for the effect data buffer from which to
+ * play the effects.
+ * @param aEffectIndex Index of the effect that is being played.
+ * @param aEffectHandle Out-parameter to which the handle for the played
+ * effect is returned.
+ */
+ void Play( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus );
+
+public:
+
+ /**
+ * From CActive
+ */
+ virtual void RunL();
+
+ /**
+ * From CActive
+ */
+ virtual void DoCancel();
+
+ /**
+ * From CActive
+ */
+ virtual TInt RunError( TInt aError );
+
+private:
+
+ /**
+ * Pointer to the MT_HapticsClient.
+ * Not owned.
+ */
+ MT_HapticsClient* iMTCallback;
+
+ TRequestStatus* iClientStatus;
+ };
+
+/**
+ * Generated EUnit test suite class.
+ */
+NONSHARABLE_CLASS( MT_HapticsClient ) : public CEUnitTestSuiteClass
+ {
+public: // Constructors and destructor
+
+ static MT_HapticsClient* NewL();
+ static MT_HapticsClient* NewLC();
+ ~MT_HapticsClient();
+
+ /**
+ * Method, which is called by the status callback, when a status
+ * has been received. Stops the wait loop waiting for a new status.
+ */
+ void HapticsStatusReceived();
+
+private: // Constructors
+
+ MT_HapticsClient();
+ void ConstructL();
+
+private: // New methods
+
+ /**
+ * Test construction; Creates haptics client instance.
+ */
+ void SetupL();
+
+ /**
+ * Test teardown; Deletes haptics client instance.
+ */
+ void Teardown();
+
+ /**
+ * Empty method to be used as setup() and teardown() in test
+ * cases, where all test code is in the actual test method.
+ */
+ void Dummy();
+
+ /**
+ * Helpers for creating effects
+ */
+ void CreateMagSweepEffect( CHWRMHaptics::THWRMHapticsMagSweepEffect& aEffect );
+ void CreatePeriodicEffect( CHWRMHaptics::THWRMHapticsPeriodicEffect& aEffect );
+ void CreateIVTEffect( RBuf8& aBuffer, CHWRMHaptics::THWRMHapticsEffectTypes aType );
+
+ /**
+ * Helper for such cases where it is first needed to load IVT data
+ */
+ TInt LoadIVTDataInternal( TInt& aFileHandle, CHWRMHaptics::THWRMHapticsEffectTypes aType,
+ TBool aOpenActuator = ETrue );
+
+ /**
+ * Helper for such cases where it is first needed to load IVT data
+ */
+ TInt LoadIVTDataInternal( TInt& aFileHandle,
+ const TUint8 aIvtData[],
+ TInt aIvtDataSize,
+ TBool aOpenActuator = ETrue );
+
+ /**
+ * Helper for such cases where contents of stream sample
+ * is not relevant.
+ */
+ void CreateDummyStreamSample( TInt aSize, RBuf8& aBuffer );
+
+ void T_CreateAndDeleteL();
+ void T_SeveralSessionsL();
+ void T_ConsecutiveSessionsL();
+ void T_SupportedActuators();
+ void T_OpenSupportedActuator();
+ void T_OpenNotSupportedActuator();
+ void T_OpenAllActuators();
+ void T_SeveralClientsWithOpenActuatorsL();
+ void T_PlayMagSweepEffectSynchronous();
+ void T_PlayMagSweepEffectAsynchronous();
+ void T_PlayPeriodicEffectSynchronous();
+ void T_PlayPeriodicEffectAsynchronous();
+ void T_PlayIVTEffectWithDirectDataSynchronous();
+ void T_PlayIVTEffectWithDirectDataAsynchronous();
+ void T_PlayIVTEffectRepeatWithDirectDataSynchronous();
+ void T_PlayIVTEffectRepeatWithDirectDataAsynchronous();
+ void T_GetEffectState();
+ void T_PlayNonTimelineIVTEffectRepeatWithDirectDataSynchronous();
+ void T_PlayNonTimelineIVTEffectRepeatWithDirectDataAsynchronous();
+ void T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueSynchronous();
+ void T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueAsynchronous();
+ void T_LoadMultipleIVTData();
+ void T_PlayIVTEffectsFromMultipleIVTDataSynchronous();
+ void T_PlayIVTEffectsFromMultipleIVTDataAsynchronous();
+ void T_PlayIVTEffectRepeatFromMultipleIVTDataSynchronous();
+ void T_PlayIVTEffectRepeatFromMultipleIVTDataAsynchronous();
+ void T_LoadIVTData();
+ void T_DeleteIVTData();
+ void T_DeleteAllIVTData();
+ void T_LoadAndDeleteIVTData();
+ void T_LoadAndDeleteIVTDataMixed();
+ void T_LoadDeletePlaySync();
+ void T_LoadDeletePlayAsync();
+ void T_LoadDeletePlayRepeatSync();
+ void T_LoadDeletePlayRepeatAsync();
+ void T_PlayIVTEffectWithLoadedDataSynchronous();
+ void T_PlayIVTEffectWithLoadedDataAsynchronous();
+ void T_PlayIVTEffectRepeatWithLoadedDataSynchronous();
+ void T_PlayIVTEffectRepeatWithLoadedDataAsynchronous();
+ void T_ReserveAndReleaseHaptics();
+ void T_ReserveHapticsSeveralTimes();
+ void T_ReserveHapticsNoReleaseL();
+ void T_ReleaseHapticsWithoutReservingFirst();
+ void T_ReserveNoAutomaticFocusNotTrusted();
+ void T_ReserveAlreadyReservedHigherL();
+ void T_ReserveAlreadyReservedLowerL();
+ void T_PlayWhenReservedL();
+ void T_GetIVTEffectCount();
+ void T_GetIVTEffectDuration();
+ void T_GetIVTEffectIndexFromName();
+ void T_GetIVTEffectType();
+ void T_GetIVTEffectName();
+ void T_GetIVTMagSweepEffectDefinition();
+ void T_GetIVTPeriodicEffectDefinition();
+ void T_CreateAndDeleteAsynchronousL();
+ void T_SeveralSessionsAsynchronousL();
+ void T_ConsecutiveSessionsAsynchronousL();
+ void T_PauseEffect();
+ void T_ResumeEffect();
+ void T_StopEffect();
+ void T_StopAllEffects();
+ void T_PlayPauseResumeStop();
+ void T_ConstantGetters();
+ void T_ModifyMagSweepEffectSynchronous();
+ void T_ModifyMagSweepEffectAsynchronous();
+ void T_ModifyPeriodicEffectSynchronous();
+ void T_ModifyPeriodicEffectAsynchronous();
+
+ void T_VibeStatusToS60StatusConversions();
+
+ void T_GetDeviceProperty_TInt_TInt();
+ void T_GetDeviceProperty_TInt_TDesC();
+ void T_SetDeviceProperty_TInt_TInt();
+ void T_SetDeviceProperty_TInt_TDesC();
+ void T_GetDeviceCapability_TInt_TInt();
+ void T_GetDeviceCapability_TInt_TDesC();
+
+ void T_GetHapticsStatus();
+ void T_ObserveHapticsStatus();
+ void T_GetHapticsStatusWithReservations();
+ void T_ObserveHapticsStatusWithReservations();
+ void T_GetHapticsStatusWithSeveralReservations();
+ void T_ObserveHapticsStatusWithSeveralReservations();
+ void T_GetHapticsStatusWithSeveralClientsOneReservation();
+ void T_ObserveHapticsStatusWithSeveralClientsOneReservations();
+ void T_CreateStreamingEffect();
+ void T_PlayStreamingSample();
+ void T_PlayStreamingSampleAsync();
+ void T_PlayStreamingSampleWithOffset();
+ void T_PlayStreamingSampleWithOffsetAsync();
+ void T_DestroyStreamingEffect();
+ void T_ObserveActuatorStatus();
+ void T_ObserveActuatorStatusAndHapticsStatus();
+ void T_PluginMgrTransTimerExpires();
+
+private: // Data
+
+ /**
+ * Haptics client instance. Owned.
+ */
+ CHWRMHaptics* iHaptics;
+
+ /**
+ * Used to control tests, which are observing haptics status using
+ * status callback.
+ */
+ CActiveSchedulerWait iWait;
+
+ /**
+ * Async play-with-handle methods sender.
+ * Owned.
+ */
+ MT_HapticsTestAsyncPlaySender* iSender;
+
+ EUNIT_DECLARE_TEST_TABLE;
+ };
+
+#endif // __MT_HAPTICSCLIENT_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/mt_hapticsclient/mt_hapticsclient_dllmain.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,25 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "MT_HapticsClient.h"
+#include <Digia/EUnit/CEUnitTestSuite.h>
+
+EXPORT_C MEUnitTest* CreateTestSuiteL()
+ {
+ return MT_HapticsClient::NewL();
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/sis/createsis.cmd Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,26 @@
+@echo off
+REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+REM All rights reserved.
+REM This component and the accompanying materials are made available
+REM under the terms of the License "Symbian Foundation License v1.0"
+REM which accompanies this distribution, and is available
+REM at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+REM
+REM Initial Contributors:
+REM Nokia Corporation - initial contribution.
+REM
+REM Contributors:
+REM
+REM Description: ?Description
+REM
+REM
+@echo on
+
+
+copy %EPOCROOT%epoc32\release\armv5\urel\mt_hapticsclient.dll .
+
+echo.
+call makesis mt_hapticsclient.pkg mt_hapticsclient.sis
+call signsis mt_hapticsclient.sis mt_hapticsclient.sisx rd.cer rdkey.pem
+
+del MT_HapticsClient.dll /Q
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/sis/mt_hapticsclient.pkg Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,18 @@
+
+;Languages
+&EN
+
+;Header
+#{"EUnit: MT_HapticsClient"},(0x01700000),1,0,0
+
+(0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+;Localised Vendor name
+%{"SysOpen Digia Plc"}
+
+;Unique vendor name
+:"SysOpen Digia"
+
+;Files
+
+"MT_HapticsClient.dll"-"!:\sys\bin\MT_HapticsClient.dll"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/sis/rd.cer Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICzDCCAjWgAwIBAgIBADANBgkqhkiG9w0BAQUFADArMRAwDgYDVQQKEwdSRCBD
+ZXJ0MRcwFQYDVQQDEw5SRCBDZXJ0aWZpY2F0ZTAeFw0wNDExMTUxMjQyMDZaFw0z
+NzA5MjMxMjQyMDZaMCsxEDAOBgNVBAoTB1JEIENlcnQxFzAVBgNVBAMTDlJEIENl
+cnRpZmljYXRlMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDLRF+r1FGGkCwT
+rb420kbnAps7gi1yYUcXYUdWeFTuBeQe5eW46Y+LWaA8HMlDdoHRB0FgASisYcFa
+gwno9+oFf4AJka4H1gWEs5XTGwAA1s0d8XGh7W7Dt9F5FZij8F7/9Pi6+FhhxZFI
+f1DD+yry9D7+Sp+BgdNALe4XOpf25QIBA6OCAQAwgf0wDAYDVR0TBAUwAwEB/zAL
+BgNVHQ8EBAMCAoQwHQYDVR0OBBYEFFi/kuGzxhVpjGxe9ZwlxC3fH9jFMFMGA1Ud
+IwRMMEqAFFi/kuGzxhVpjGxe9ZwlxC3fH9jFoS+kLTArMRAwDgYDVQQKEwdSRCBD
+ZXJ0MRcwFQYDVQQDEw5SRCBDZXJ0aWZpY2F0ZYIBADBsBgNVHSAEZTBjMGEGBFUd
+IAAwWTATBggrBgEFBQcCARYHaHR0cDovLzBCBggrBgEFBQcCAjA2GjRGb3IgUiZE
+IHVzYWdlIG9ubHkuIFRoaXMgY2VydGlmaWNhdGUgaXMgbm90IHRydXN0ZWQuMA0G
+CSqGSIb3DQEBBQUAA4GBAHGB4RQMAgBdeT2hxfOr6f2nA/dZm+M5yX5daUtZnET9
+Ed0A9sazLawfN2G1KFQT9kxEParAyoAkpbMAsRrnRz/9cM3OHgFm/NiKRnf50DpT
+7oCx0I/65mVD2kt+xXE62/Ii5KPnTufIkPi2uLvURCia1tTS8JmJ8dtxDGyQt8BR
+-----END CERTIFICATE-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/sis/rdkey.pem Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQDLRF+r1FGGkCwTrb420kbnAps7gi1yYUcXYUdWeFTuBeQe5eW4
+6Y+LWaA8HMlDdoHRB0FgASisYcFagwno9+oFf4AJka4H1gWEs5XTGwAA1s0d8XGh
+7W7Dt9F5FZij8F7/9Pi6+FhhxZFIf1DD+yry9D7+Sp+BgdNALe4XOpf25QIBAwKB
+gQCHgupyjYuvCsgNHn7PNtnvVxInrB5MQNoPli+O+uNJWUK/Q+57Rl+yO8AoEzDX
+pFaLWiuVVhsdloDnAgabT/FXzYncs6uOHyEUV+dSXb78vtLPJqAX+Fg2i3hOXreB
+yskcZ13/OsKVOu5wgrJkx2baZufkqMwOSytf5y9nwjEIKwJBAP+inobagVNrN62j
+KQva3cC+UN/6XnKdTc0CA6bHyLOaJoH1xiMwG/VS2PGjHI0tiSMNtLn/QPpHJ003
+iabGhdUCQQDLjp/9UjFT6K6CF66Chqf30pZXhx+GTSQZmv/gvZiMly7X9fX9BGX3
+2MbJohBC4yI21XKTbisWywkF73Hwh+TRAkEAqmxprzxWN5zPyRdwspHpKymLP/w+
+9xOJM1atGdqFzRFvAU6EF3Vn+OHl9my9s3OwwgkjJqorUYTE3iUGby8D4wJBAIe0
+aqjhdjfwdFa6dFcEb/qMZDpaFQQzbWZnVUB+ZbMPdI/5TqitmU/l2dvBYCyXbCSO
+TGJJcg8yBgP09qBamIsCQFL7j1tM0XPVQJQ89WpKCld7O9ORxRGVj1eG0tWijrH8
+mGbYh8SGCVoWV3vrKSS8GBrFVgQnqUaHuEdtM7tpCAQ=
+-----END RSA PRIVATE KEY-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_eunit/update.bat Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,2 @@
+copy \epoc32\release\winscw\udeb\ut_*.dll \epoc32\release\winscw\udeb\z\sys\bin\
+copy \epoc32\release\winscw\udeb\mt_*.dll \epoc32\release\winscw\udeb\z\sys\bin\
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/bwins/hapticsclienttestu.def Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+ ?LibEntryL@@YAPAVCHapticsClientTest@@AAVCTestModuleIf@@@Z @ 1 NONAME ; class CHapticsClientTest * LibEntryL(class CTestModuleIf &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/conf/hapticsclienttest.cfg Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,1127 @@
+[Define]
+// Add general definitions here
+ETrue 1
+EFalse 0
+[Enddefine]
+
+[StifSettings]
+// Add stif settings here
+CheckHeapBalance= on
+[EndStifSettings]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 001: Create and destroy
+create hapticsclienttest testClass
+print STEP 1 : Create and destroy
+testClass CreateAndDestroy
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 002: Several sessions
+create hapticsclienttest testClass
+print STEP 1 : Several sessions
+testClass SeveralSessions
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 003: Consecutive sessions
+create hapticsclienttest testClass
+print STEP 1 : Consecutive sessions
+testClass ConsecutiveSessions
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 004: Supported actuators
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Supported actuators
+testClass SupportedActuators
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 005: Open supported actuator
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Open supported actuator
+testClass OpenSupportedActuator
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 006: Open unsupported actuator
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Open unsupported actuator
+testClass OpenUnsupportedActuator
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 007: Open all actuators
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Open all actuators
+testClass OpenAllActuators
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 008: 2 clients open actuators
+create hapticsclienttest testClass
+print STEP 1 : 2 clients open actuators
+testClass 2ClientsOpenActuators
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 009: Play MagSweep synch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play MagSweep synch (data)
+testClass PlayMagSweepSynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 010: Play MagSweep asynch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play MagSweep asynch (data)
+testClass PlayMagSweepAsynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 011: Play Periodic synch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play Periodic synch (data)
+testClass PlayPeriodicSynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 012: Play Periodic asynch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play Periodic asynch (data)
+testClass PlayPeriodicAsynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 013: Play IVT synch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play IVT synch (data)
+testClass PlayIVTSynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 014: Play IVT asynch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play IVT asynch (data)
+testClass PlayIVTAsynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 015: Repeat IVT synch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Repeat IVT synch (data)
+testClass RepeatIVTSynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 016: Repeat IVT asynch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Repeat IVT asynch (data)
+testClass RepeatIVTAsynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 017: Get effect state
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get effect state
+testClass GetEffectState
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 018: Repeat IVT synch (data - non-timeline)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Repeat IVT synch (data - non-timeline)
+testClass RepeatIVTSynchDataNonTimeline
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 019: Repeat IVT asynch (data - non-timeline)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Repeat IVT asynch (data - non-timeline)
+testClass RepeatIVTAsynchDataNonTimeline
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 020: Zero-repeat IVT synch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Zero-repeat IVT synch (data)
+testClass Zero-repeatIVTSynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 021: Zero-repeat IVT asynch (data)
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Zero-repeat IVT asynch (data)
+testClass Zero-repeatIVTAsynchData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 022: Load IVT data
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load IVT data
+testClass LoadIVTData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 023: Delete IVT data
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Delete IVT data
+testClass DeleteIVTData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 024: Delete All IVT data
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Delete All IVT data
+testClass DeleteAllIVTData
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 025: Load and delete multiple
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load and delete multiple
+testClass LoadAndDeleteMultiple
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 026: Load and delete mixed
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load and delete mixed
+testClass LoadAndDeleteMixed
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 027: Load, Del, Play sync
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load, Del, Play sync
+testClass LoadDeletePlaySync
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 028: Load, Del, Play async
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load, Del, Play async
+testClass LoadDeletePlayAsync
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 029: Load, Del, Repeat sync
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load, Del, Repeat sync
+testClass LoadDeletePlayRepeatSync
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 030: Load, Del, Repeat async
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load, Del, Repeat async
+testClass LoadDeletePlayRepeatAsync
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 031: Play loaded IVT synch
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play loaded IVT synch
+testClass PlayLoadedIVTSynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 032: Play loaded IVT asynch
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play loaded IVT asynch
+testClass PlayLoadedIVTAsynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 033: Repeat loaded IVT synch
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Repeat loaded IVT synch
+testClass RepeatLoadedIVTSynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 034: Repeat loaded IVT asynch
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Repeat loaded IVT asynch
+testClass RepeatLoadedIVTAsynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 035: Load multiple IVT-data
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Load multiple IVT-data
+testClass LoadMultipleIVT-data
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 036: Play from multiple IVT-data synch
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play from multiple IVT-data synch
+testClass PlayFromMultipleIVT-dataSynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 037: Play from multiple IVT-data asynch
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play from multiple IVT-data asynch
+testClass PlayFromMultipleIVT-dataAsynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 038: Play repeat from multiple IVT-data
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play repeat from multiple IVT-data synch
+testClass PlayRepeatFromMultipleIVT-dataSynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 039: Play repeat from multiple IVT-data
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play repeat from multiple IVT-data asynch
+testClass PlayRepeatFromMultipleIVT-dataAsynch
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 040: Status conversions
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Status conversions
+testClass StatusConversions
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 041: Reserve and release
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Reserve and release
+testClass ReserveAndRelease
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 042: Reserve several times
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Reserve several times
+testClass ReserveSeveralTimes
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 043: Reserve, no release
+create hapticsclienttest testClass
+print STEP 1 : Reserve, no release
+testClass ReserveNoRelease
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 044: Release, no reserve
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Release, no reserve
+testClass ReleaseNoReserve
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 045: Reserve forceNoCoe
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Reserve forceNoCoe
+testClass ReserveForceNoCoe
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 046: Reserve reserved higher
+create hapticsclienttest testClass
+print STEP 1 : Reserve reserved higher
+testClass ReserveReservedHigher
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 047: Reserve reserved lower
+create hapticsclienttest testClass
+print STEP 1 : Reserve reserved lower
+testClass ReserveReservedLower
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 048: Play when reserved
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play when reserved
+testClass PlayWhenReserved
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 049: Get effect count
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get effect count
+testClass GetEffectCount
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 050: Get effect duration
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get effect duration
+testClass GetEffectDuration
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 051: Get effect index from name
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get effect index from name
+testClass GetEffectIndexFromName
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 052: Get effect type
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get effect type
+testClass GetEffectType
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 053: Get effect name
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get effect name
+testClass GetEffectName
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 054: Get MagSweep effect definition
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get MagSweep effect definition
+testClass GetMagSweepEffectDefinition
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 055: Get Periodic effect definition
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get Periodic effect definition
+testClass GetPeriodicEffectDefinition
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 056: Create and destroy asynchronous
+create hapticsclienttest testClass
+print STEP 1 : Create and destroy asynchronous
+testClass CreateAndDestroyAsynchronous
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 057: Several sessions asynchronous
+create hapticsclienttest testClass
+print STEP 1 : Several sessions asynchronous
+testClass SeveralSessionsAsynchronous
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 058: Consecutive sessions asynchronous
+create hapticsclienttest testClass
+print STEP 1 : Consecutive sessions asynchronous
+testClass ConsecutiveSessionsAsynchronous
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 059: Constant getters
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Constant getters
+testClass ConstantGetters
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 060: Pause effect
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Pause effect
+testClass PauseEffect
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 061: Resume effect
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Resume effect
+testClass ResumeEffect
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 062: Stop effect
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Stop effect
+testClass StopEffect
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 063: Stop all effects
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Stop all effects
+testClass StopAllEffects
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 064: Play, pause, resume, stop
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play, pause, resume, stop
+testClass PlayPauseResumeStop
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 065: Modify playing magsweep effect synchronous
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Modify playing magsweep effect synchronous
+testClass ModifyPlayingMagsweepEffectSynchronous
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 066: Modify playing magsweep effect asynchronous
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Modify playing magsweep effect asynchronous
+testClass ModifyPlayingMagsweepEffectAsynchronous
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 067: Modify playing periodic effect synchronous
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Modify playing periodic effect synchronous
+testClass ModifyPlayingPeriodicEffectSynchronous
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 068: Modify playing periodic effect asynchronous
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Modify playing periodic effect asynchronous
+testClass ModifyPlayingPeriodicEffectAsynchronous
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 069: Get device property of TInt value
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get device property of TInt value
+testClass GetDevicePropertyOfTIntValue
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 070: Get device property of TDesC value
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get device property of TDesC value
+testClass GetDevicePropertyOfTDesCValue
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 071: Set device property of TInt value
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Set device property of TInt value
+testClass SetDevicePropertyOfTIntValue
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 072: Set device property of TDesC value
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Set device property of TDesC value
+testClass SetDevicePropertyOfTDesCValue
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 073: Get device capability of TInt value
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get device capability of TInt value
+testClass GetDeviceCapabilityOfTIntValue
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 074: Get device capability of TDesC value
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Get device capability of TDesC value
+testClass GetDeviceCapabilityOfTDesCValue
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 075: Fetch status
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Fetch status
+testClass FetchStatus
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 076: Observe status
+create hapticsclienttest testClass
+print STEP 1 : Observe status
+testClass ObserveStatus
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 077: Status, reservation
+create hapticsclienttest testClass
+print STEP 1 : Status, reservation
+testClass StatusReservation
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 078: Status, observe, reservation
+create hapticsclienttest testClass
+print STEP 1 : Status, observe, reservation
+testClass StatusObserveReservation
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 079: Status, 2 reservations
+create hapticsclienttest testClass
+print STEP 1 : Status, 2 reservations
+testClass Status2Reservations
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 080: Status, observe, 2 reservation
+create hapticsclienttest testClass
+print STEP 1 : Status, observe, 2 reservation
+testClass StatusObserve2Reservation
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 081: Status, many clients
+create hapticsclienttest testClass
+print STEP 1 : Status, many clients
+testClass StatusManyClients
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 082: Status, observer, many clients
+create hapticsclienttest testClass
+print STEP 1 : Status, observer, many clients
+testClass StatusObserverManyClients
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 083: Create streaming effect
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Create streaming effect
+testClass CreateStreamingEffect
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 084: Play streaming sample
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play streaming sample
+testClass PlayStreamingSample
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 085: Play streaming sample, async
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play streaming sample, async
+testClass PlayStreamingSampleAsync
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 086: Play streaming sample with offset
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play streaming sample with offset
+testClass PlayStreamingSampleWithOffset
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 087: Play streaming sample with offset, async
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Play streaming sample with offset, async
+testClass PlayStreamingSampleWithOffsetAsync
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 088: Destroy streaming effect
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Destroy streaming effect
+testClass DestroyStreamingEffect
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 089: Actuator status
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Actuator status
+testClass ActuatorStatus
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 090: Actuator/Haptics status
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Actuator/Haptics status
+testClass ActuatorOrHapticsStatus
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
+
+//------------------------------------------------------------------------------
+[Test]
+title Test case # 091: Plugin Manager Timer Expires
+create hapticsclienttest testClass
+print STEP 1 : Setup
+testClass Setup
+print STEP 2 : Plugin Manager Transction response Timer Expires
+testClass PluginMgrTransTimerExpires
+print STEP 3 : Teardown
+testClass Teardown
+delete testClass
+[Endtest]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/eabi/hapticsclienttestu.def Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,3 @@
+EXPORTS
+ _Z9LibEntryLR13CTestModuleIf @ 1 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,31 @@
+/*
+* 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 the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../init/hwrmhapticsuid.ini /epoc32/release/winscw/udeb/z/private/200184b9/hwrmhapticsuid.ini
+../init/hwrmhapticsuid.ini /epoc32/data/z/private/200184b9/hwrmhapticsuid.ini
+../init/hapticsclienttest.ini /epoc32/winscw/c/TestFramework/hapticsclienttest.ini
+../conf/hapticsclienttest.cfg /epoc32/winscw/c/TestFramework/hapticsclienttest.cfg
+
+
+PRJ_MMPFILES
+hapticsclienttest.mmp
+
+// End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/createsis.cmd Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,21 @@
+@echo off
+REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+REM All rights reserved.
+REM This component and the accompanying materials are made available
+REM under the terms of the License "Symbian Foundation License v1.0"
+REM which accompanies this distribution, and is available
+REM at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+REM
+REM Initial Contributors:
+REM Nokia Corporation - initial contribution.
+REM
+REM Contributors:
+REM
+REM Description: ?Description
+REM
+REM
+@echo on
+
+echo.
+call makesis hapticsclienttest.pkg hapticsclienttest.sis
+call signsis hapticsclienttest.sis hapticsclienttest.sisx rd.cer rdkey.pem
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/envrecall.cmd Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,47 @@
+@echo off
+REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+REM All rights reserved.
+REM This component and the accompanying materials are made available
+REM under the terms of "Eclipse Public License v1.0"
+REM which accompanies this distribution, and is available
+REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+REM
+REM Initial Contributors:
+REM Nokia Corporation - initial contribution.
+REM
+REM Contributors:
+REM
+REM Description: ?Description
+REM
+REM
+@echo on
+
+
+@echo Cleaning Haptics Test stubs...
+pushd ..\..\hapticstestplugins\group\
+call sbs -c armv5.test reallyclean
+call sbs -c winscw.test reallyclean
+popd
+@echo Cleaning Haptics Test stubs... Finished
+
+
+@echoBuild Haptics SystemSW Adaptation Stub plugins...
+pushd \sf\adaptation\stubs\systemswstubs\hwrmhapticsstubplugin\group
+call sbs -c winscw
+popd
+@echo Build Haptics SystemSW Adaptation Stub plugins... Finished
+
+
+@echo Build Haptics NCP Adaptation plugins...
+pushd \ncp_sw\corecom\modemadaptation_ext\adaptationlayer_ext\hapticsadaptation\group
+call sbs -c armv5
+call sbs -c armv5.atlantis
+call sbs -c armv5.atlantis102
+call sbs -c armv5.atlantisry21x
+call sbs -c armv5.gekko79
+call sbs -c armv5.platsim79
+call sbs -c armv5.tasmania
+call sbs -c armv5.vasco
+REM NOTE!! Please keep updating the above list as per the variant's available in the Product SDK
+popd
+@echo Build Haptics NCP Adaptation plugins... Finished
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/envsetup.cmd Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,49 @@
+@echo off
+REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+REM All rights reserved.
+REM This component and the accompanying materials are made available
+REM under the terms of "Eclipse Public License v1.0"
+REM which accompanies this distribution, and is available
+REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+REM
+REM Initial Contributors:
+REM Nokia Corporation - initial contribution.
+REM
+REM Contributors:
+REM
+REM Description: ?Description
+REM
+REM
+@echo on
+
+
+@echo Cleaning Haptics NCP Adaptation plugins...
+pushd \ncp_sw\corecom\modemadaptation_ext\adaptationlayer_ext\hapticsadaptation\group
+call sbs -c armv5 reallyclean
+call sbs -c armv5.atlantis reallyclean
+call sbs -c armv5.atlantis102 reallyclean
+call sbs -c armv5.atlantisry21x reallyclean
+call sbs -c armv5.gekko79 reallyclean
+call sbs -c armv5.platsim79 reallyclean
+call sbs -c armv5.tasmania reallyclean
+call sbs -c armv5.vasco reallyclean
+REM NOTE!! Please keep updating the above list as per the variant's available in the Product SDK
+popd
+@echo Cleaning Haptics NCP Adaptation plugins... Finished
+
+
+@echo Cleaning Haptics SystemSW Adaptation Stub plugins...
+pushd \sf\adaptation\stubs\systemswstubs\hwrmhapticsstubplugin\group
+call sbs -c winscw reallyclean
+popd
+@echo Cleaning Haptics SystemSW Adaptation Stub plugins... Finished
+
+
+@echo Setting up Haptics Test stubs...
+pushd ..\..\hapticstestplugins\group\
+call sbs -c armv5.test reallyclean
+call sbs -c winscw.test reallyclean
+call sbs -c armv5.test
+call sbs -c winscw.test
+popd
+@echo Setting up Haptics Test stubs... Finished
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/hapticsclienttest.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET hapticsclienttest.dll
+TARGETTYPE dll
+UID 0x1000af5a 0x101FB3E7
+
+CAPABILITY ALL -TCB
+VENDORID VID_DEFAULT
+
+// Sources required by the test suite
+SOURCEPATH ../src
+SOURCE hapticsclienttest_main.cpp
+SOURCE hapticsclienttest.cpp
+
+USERINCLUDE ../inc
+
+OS_LAYER_LIBC_SYSTEMINCLUDE
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY stiftestinterface.lib
+LIBRARY hwrmhapticsclient.lib
+
+LANG SC
+
+EPOCALLOWDLLDATA
+
+/*
+START WINS
+?wins_specific_information
+END
+
+START MARM
+?marm_specific_information
+END
+*/
+// Other possible keywords:
+
+// DOCUMENT ?file, that is not compiled, but added to MSVC project workspace (i.e. release notes)
+/*
+START BITMAP ?target
+TARGETPATH ?emulated_path_on_target_machine
+HEADER
+SOURCE ?color_depth ?source_bitmap
+END
+*/
+// DEFFILE ?filename
+// AIF ?filename
+
+SMPSAFE
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/hapticsclienttest.pkg Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,34 @@
+;
+; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of the License "Symbian Foundation License v1.0"
+; which accompanies this distribution, and is available
+; at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+;
+; Initial Contributors:
+; Nokia Corporation - initial contribution.
+;
+; Contributors:
+;
+; Description:
+;
+;
+
+
+;Languages
+&EN
+
+#{"hapticstestcontrol"},(0x101FB3E7),1,0,0,TYPE=SA
+
+;Localised Vendor name
+%{"hapticstestcontrol EN"}
+
+; Vendor name
+: "hapticstestcontrol"
+
+"\epoc32\release\armv5\urel\hapticsclienttest.dll"-"c:\sys\bin\hapticsclienttest.dll"
+
+"..\conf\hapticsclienttest.cfg"-"c:\testframework\hapticsclienttest.cfg"
+"..\init\hapticsclienttest.ini"-"c:\testframework\hapticsclienttest.ini"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/mt_hapticslicense.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET MT_HapticsLicense.dll
+TARGETTYPE dll
+UID 0x1000af5a 0x01700000
+
+CAPABILITY ALL -TCB -DRM
+VENDORID VID_DEFAULT
+
+
+// Sources required by the test suite
+
+SOURCEPATH ../MT_HapticsLicenseKey
+SOURCE mt_hapticslicensekey.cpp
+SOURCE MT_HapticsLicenseKey_DllMain.cpp
+
+USERINCLUDE ../MT_HapticsLicenseKey
+
+OS_LAYER_LIBC_SYSTEMINCLUDE
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY EUnit.lib
+LIBRARY EUnitUtil.lib
+LIBRARY euser.lib
+LIBRARY hwrmhapticsclient.lib
+LIBRARY hwrmhapticslicense.lib
+
+SMPSAFE
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/rd.cer Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICzDCCAjWgAwIBAgIBADANBgkqhkiG9w0BAQUFADArMRAwDgYDVQQKEwdSRCBD
+ZXJ0MRcwFQYDVQQDEw5SRCBDZXJ0aWZpY2F0ZTAeFw0wNDExMTUxMjQyMDZaFw0z
+NzA5MjMxMjQyMDZaMCsxEDAOBgNVBAoTB1JEIENlcnQxFzAVBgNVBAMTDlJEIENl
+cnRpZmljYXRlMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDLRF+r1FGGkCwT
+rb420kbnAps7gi1yYUcXYUdWeFTuBeQe5eW46Y+LWaA8HMlDdoHRB0FgASisYcFa
+gwno9+oFf4AJka4H1gWEs5XTGwAA1s0d8XGh7W7Dt9F5FZij8F7/9Pi6+FhhxZFI
+f1DD+yry9D7+Sp+BgdNALe4XOpf25QIBA6OCAQAwgf0wDAYDVR0TBAUwAwEB/zAL
+BgNVHQ8EBAMCAoQwHQYDVR0OBBYEFFi/kuGzxhVpjGxe9ZwlxC3fH9jFMFMGA1Ud
+IwRMMEqAFFi/kuGzxhVpjGxe9ZwlxC3fH9jFoS+kLTArMRAwDgYDVQQKEwdSRCBD
+ZXJ0MRcwFQYDVQQDEw5SRCBDZXJ0aWZpY2F0ZYIBADBsBgNVHSAEZTBjMGEGBFUd
+IAAwWTATBggrBgEFBQcCARYHaHR0cDovLzBCBggrBgEFBQcCAjA2GjRGb3IgUiZE
+IHVzYWdlIG9ubHkuIFRoaXMgY2VydGlmaWNhdGUgaXMgbm90IHRydXN0ZWQuMA0G
+CSqGSIb3DQEBBQUAA4GBAHGB4RQMAgBdeT2hxfOr6f2nA/dZm+M5yX5daUtZnET9
+Ed0A9sazLawfN2G1KFQT9kxEParAyoAkpbMAsRrnRz/9cM3OHgFm/NiKRnf50DpT
+7oCx0I/65mVD2kt+xXE62/Ii5KPnTufIkPi2uLvURCia1tTS8JmJ8dtxDGyQt8BR
+-----END CERTIFICATE-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/group/rdkey.pem Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQDLRF+r1FGGkCwTrb420kbnAps7gi1yYUcXYUdWeFTuBeQe5eW4
+6Y+LWaA8HMlDdoHRB0FgASisYcFagwno9+oFf4AJka4H1gWEs5XTGwAA1s0d8XGh
+7W7Dt9F5FZij8F7/9Pi6+FhhxZFIf1DD+yry9D7+Sp+BgdNALe4XOpf25QIBAwKB
+gQCHgupyjYuvCsgNHn7PNtnvVxInrB5MQNoPli+O+uNJWUK/Q+57Rl+yO8AoEzDX
+pFaLWiuVVhsdloDnAgabT/FXzYncs6uOHyEUV+dSXb78vtLPJqAX+Fg2i3hOXreB
+yskcZ13/OsKVOu5wgrJkx2baZufkqMwOSytf5y9nwjEIKwJBAP+inobagVNrN62j
+KQva3cC+UN/6XnKdTc0CA6bHyLOaJoH1xiMwG/VS2PGjHI0tiSMNtLn/QPpHJ003
+iabGhdUCQQDLjp/9UjFT6K6CF66Chqf30pZXhx+GTSQZmv/gvZiMly7X9fX9BGX3
+2MbJohBC4yI21XKTbisWywkF73Hwh+TRAkEAqmxprzxWN5zPyRdwspHpKymLP/w+
+9xOJM1atGdqFzRFvAU6EF3Vn+OHl9my9s3OwwgkjJqorUYTE3iUGby8D4wJBAIe0
+aqjhdjfwdFa6dFcEb/qMZDpaFQQzbWZnVUB+ZbMPdI/5TqitmU/l2dvBYCyXbCSO
+TGJJcg8yBgP09qBamIsCQFL7j1tM0XPVQJQ89WpKCld7O9ORxRGVj1eG0tWijrH8
+mGbYh8SGCVoWV3vrKSS8GBrFVgQnqUaHuEdtM7tpCAQ=
+-----END RSA PRIVATE KEY-----
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/inc/hapticsclienttest.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,215 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifndef HAPTICSCLIENTTEST_H
+#define HAPTICSCLIENTTEST_H
+
+// INCLUDES
+#include <hwrmhaptics.h>
+#include "hapticsclienttest_main.h"
+
+
+/**
+ * Callback class for haptics status observation.
+ */
+NONSHARABLE_CLASS( THapticsStatusCallback ) : public MHWRMHapticsObserver
+ {
+public:
+
+ /**
+ * C++ constructor.
+ */
+ THapticsStatusCallback( CHapticsClientTest* aMTCallback );
+
+ /**
+ * Destructor.
+ */
+ ~THapticsStatusCallback();
+
+ /**
+ * Returns the last received status.
+ *
+ * @return Last status value.
+ */
+ MHWRMHapticsObserver::THWRMHapticsStatus Status();
+
+ /**
+ * Starts a new wait loop under the current active scheduler.
+ * This method can be used in module tests to wait for the
+ * notification to be received. When the notification is
+ * received (i.e. callback is called by haptics), the waiting
+ * is stopped and the execution continues whereever this method
+ * was called.
+ */
+ void WaitForNotification();
+
+public: // from MHWRMHapticsObserver
+
+ virtual void HapticsStatusChangedL( THWRMHapticsStatus aStatus );
+ virtual void EffectCompletedL( TInt aError, TInt aEffectHandle );
+
+private:
+
+ /**
+ * Last received haptics status through status observation.
+ */
+ MHWRMHapticsObserver::THWRMHapticsStatus iHapticsStatus;
+
+ /**
+ * Callback which is notified, when a status has been received.
+ */
+ CHapticsClientTest* iMTCallback;
+ };
+
+
+/**
+ * Callback class for actuator status observation.
+ */
+NONSHARABLE_CLASS( TActuatorStatusCallback ) : public MHWRMHapticsActuatorObserver
+ {
+public:
+
+ /**
+ * C++ constructor.
+ */
+ TActuatorStatusCallback( CHapticsClientTest* aMTCallback );
+
+ /**
+ * Destructor.
+ */
+ ~TActuatorStatusCallback();
+
+ /**
+ * Returns the last received state.
+ *
+ * @return Last status value.
+ */
+ MHWRMHapticsActuatorObserver::THWRMActuatorEvents Status( THWRMLogicalActuators aActuator );
+
+ /**
+ * Starts a new wait loop under the current active scheduler.
+ * This method can be used in module tests to wait for the
+ * notification to be received. When the notification is
+ * received (i.e. callback is called by haptics), the waiting
+ * is stopped and the execution continues whereever this method
+ * was called.
+ */
+ void WaitForNotification();
+
+public: // from MHWRMHapticsActuatorObserver
+
+ virtual void ActuatorEventL( THWRMActuatorEvents aEvent,
+ THWRMLogicalActuators aActuator );
+
+private:
+
+ /**
+ * Last received actuator status through state observation.
+ */
+ RArray<TInt> iActuatorStatus;
+
+ /**
+ * Callback which is notified, when a state has been received.
+ */
+ CHapticsClientTest* iMTCallback;
+ };
+
+/**
+ * Class for making async play-with-filehandle calls on behalf of the
+ * CHapticsClientTest
+ */
+NONSHARABLE_CLASS( MT_HapticsTestAsyncPlaySender ) : public CActive
+ {
+public:
+
+ /**
+ * Constructor
+ *
+ * @param aUi Pointer to the test appl UI object.
+ */
+ MT_HapticsTestAsyncPlaySender( CHapticsClientTest* aMTCallback );
+
+ /**
+ * Destructor
+ */
+ virtual ~MT_HapticsTestAsyncPlaySender();
+
+ /**
+ * Method for fileHandle type playing of effects repeatedly in asynch mode
+ *
+ * @param aHaptics Pointer to the haptics interface object.
+ * @param aFileHandle Handle for the effect data buffer from which to
+ * play the effects.
+ * @param aEffectIndex Index of the effect that is being played.
+ * @param aRepeat Number of repeats.
+ * @param aEffectHandle Out-parameter to which the handle for the played
+ * effect is returned.
+ */
+ void PlayRepeat( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TUint8 aRepeat,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus );
+
+ /**
+ * Method for fileHandle type playing of effects in asynch mode
+ *
+ * @param aHaptics Pointer to the haptics interface object.
+ * @param aFileHandle Handle for the effect data buffer from which to
+ * play the effects.
+ * @param aEffectIndex Index of the effect that is being played.
+ * @param aEffectHandle Out-parameter to which the handle for the played
+ * effect is returned.
+ */
+ void Play( CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus );
+
+public:
+
+ /**
+ * From CActive
+ */
+ virtual void RunL();
+
+ /**
+ * From CActive
+ */
+ virtual void DoCancel();
+
+ /**
+ * From CActive
+ */
+ virtual TInt RunError( TInt aError );
+
+private:
+
+ /**
+ * Pointer to the CHapticsClientTest.
+ * Not owned.
+ */
+ CHapticsClientTest* iMTCallback;
+
+ TRequestStatus* iClientStatus;
+ };
+
+
+#endif // HAPTICSCLIENTTEST_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/inc/hapticsclienttest_main.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,289 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: ?Description
+*
+*/
+
+
+
+#ifndef HAPTICSCLIENTTESTMAIN_H
+#define HAPTICSCLIENTTESTMAIN_H
+
+// INCLUDES
+#include <StifLogger.h>
+#include <TestScripterInternal.h>
+#include <StifTestModule.h>
+#include <hwrmhaptics.h>
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define ?macro ?macro_def
+// Logging path
+_LIT( KHapticsClientTestLogPath, "\\logs\\HapticsClientTest\\" );
+// Log file
+_LIT( KHapticsClientTestLogFile, "HapticsClientTest.txt" );
+
+// FUNCTION PROTOTYPES
+//?type ?function_name(?arg_list);
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+class MT_HapticsTestAsyncPlaySender;
+
+// DATA TYPES
+//enum ?declaration
+//typedef ?declaration
+//extern ?data_type;
+
+// CLASS DECLARATION
+
+/**
+* HpaticsClient test class for STIF Test Framework TestScripter.
+* ?other_description_lines
+*
+* @lib ?library
+* @since ?Series60_version
+*/
+NONSHARABLE_CLASS(CHapticsClientTest) : public CScriptBase
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CHapticsClientTest* NewL( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CHapticsClientTest();
+
+ public: // New functions
+
+ /**
+ * ?member_description.
+ * @since ?Series60_version
+ * @param ?arg1 ?description
+ * @return ?description
+ */
+ //?type ?member_function( ?type ?arg1 );
+
+ public: // Functions from base classes
+
+ /**
+ * From CScriptBase Runs a script line.
+ * @since ?Series60_version
+ * @param aItem Script line containing method name and parameters
+ * @return Symbian OS error code
+ */
+ virtual TInt RunMethodL( CStifItemParser& aItem );
+
+ /**
+ * Method, which is called by the status callback, when a status
+ * has been received. Stops the wait loop waiting for a new status.
+ */
+ void HapticsStatusReceived();
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CHapticsClientTest( CTestModuleIf& aTestModuleIf );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ // Prohibit copy constructor if not deriving from CBase.
+ // ?classname( const ?classname& );
+ // Prohibit assigment operator if not deriving from CBase.
+ // ?classname& operator=( const ?classname& );
+
+ /**
+ * Frees all resources allocated from test methods.
+ * @since ?Series60_version
+ */
+ void Delete();
+
+ /**
+ * Build resources needed for test methods.
+ * @since ?Series60_version
+ */
+ void BuildL ();
+
+ /**
+ * Test methods are listed below.
+ */
+ /**
+ * Test construction; Creates haptics client instance.
+ */
+ TInt SetupL();
+
+ /**
+ * Test teardown; Deletes haptics client instance.
+ */
+ TInt Teardown();
+
+ /**
+ * Helpers for creating effects
+ */
+ void CreateMagSweepEffect( CHWRMHaptics::THWRMHapticsMagSweepEffect& aEffect );
+ void CreatePeriodicEffect( CHWRMHaptics::THWRMHapticsPeriodicEffect& aEffect );
+ void CreateIVTEffect( RBuf8& aBuffer, CHWRMHaptics::THWRMHapticsEffectTypes aType );
+
+ /**
+ * Helper for such cases where it is first needed to load IVT data
+ */
+ TInt LoadIVTDataInternal( TInt& aFileHandle, CHWRMHaptics::THWRMHapticsEffectTypes aType,
+ TBool aOpenActuator = ETrue );
+
+ /**
+ * Helper for such cases where it is first needed to load IVT data
+ */
+ TInt LoadIVTDataInternal( TInt& aFileHandle,
+ const TUint8 aIvtData[],
+ TInt aIvtDataSize,
+ TBool aOpenActuator = ETrue );
+
+ /**
+ * Helper for such cases where contents of stream sample
+ * is not relevant.
+ */
+ void CreateDummyStreamSample( TInt aSize, RBuf8& aBuffer );
+
+ TInt T_CreateAndDeleteL();
+ TInt T_SeveralSessionsL();
+ TInt T_ConsecutiveSessionsL();
+ TInt T_SupportedActuators();
+ TInt T_OpenSupportedActuator();
+ TInt T_OpenNotSupportedActuator();
+ TInt T_OpenAllActuators();
+ TInt T_SeveralClientsWithOpenActuatorsL();
+ TInt T_PlayMagSweepEffectSynchronous();
+ TInt T_PlayMagSweepEffectAsynchronous();
+ TInt T_PlayPeriodicEffectSynchronous();
+ TInt T_PlayPeriodicEffectAsynchronous();
+ TInt T_PlayIVTEffectWithDirectDataSynchronous();
+ TInt T_PlayIVTEffectWithDirectDataAsynchronous();
+ TInt T_PlayIVTEffectRepeatWithDirectDataSynchronous();
+ TInt T_PlayIVTEffectRepeatWithDirectDataAsynchronous();
+ TInt T_GetEffectState();
+ TInt T_PlayNonTimelineIVTEffectRepeatWithDirectDataSynchronous();
+ TInt T_PlayNonTimelineIVTEffectRepeatWithDirectDataAsynchronous();
+ TInt T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueSynchronous();
+ TInt T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueAsynchronous();
+ TInt T_LoadMultipleIVTData();
+ TInt T_PlayIVTEffectsFromMultipleIVTDataSynchronous();
+ TInt T_PlayIVTEffectsFromMultipleIVTDataAsynchronous();
+ TInt T_PlayIVTEffectRepeatFromMultipleIVTDataSynchronous();
+ TInt T_PlayIVTEffectRepeatFromMultipleIVTDataAsynchronous();
+ TInt T_LoadIVTData();
+ TInt T_DeleteIVTData();
+ TInt T_DeleteAllIVTData();
+ TInt T_LoadAndDeleteIVTData();
+ TInt T_LoadAndDeleteIVTDataMixed();
+ TInt T_LoadDeletePlaySync();
+ TInt T_LoadDeletePlayAsync();
+ TInt T_LoadDeletePlayRepeatSync();
+ TInt T_LoadDeletePlayRepeatAsync();
+ TInt T_PlayIVTEffectWithLoadedDataSynchronous();
+ TInt T_PlayIVTEffectWithLoadedDataAsynchronous();
+ TInt T_PlayIVTEffectRepeatWithLoadedDataSynchronous();
+ TInt T_PlayIVTEffectRepeatWithLoadedDataAsynchronous();
+ TInt T_ReserveAndReleaseHaptics();
+ TInt T_ReserveHapticsSeveralTimes();
+ TInt T_ReserveHapticsNoReleaseL();
+ TInt T_ReleaseHapticsWithoutReservingFirst();
+ TInt T_ReserveNoAutomaticFocusNotTrusted();
+ TInt T_ReserveAlreadyReservedHigherL();
+ TInt T_ReserveAlreadyReservedLowerL();
+ TInt T_PlayWhenReservedL();
+ TInt T_GetIVTEffectCount();
+ TInt T_GetIVTEffectDuration();
+ TInt T_GetIVTEffectIndexFromName();
+ TInt T_GetIVTEffectType();
+ TInt T_GetIVTEffectName();
+ TInt T_GetIVTMagSweepEffectDefinition();
+ TInt T_GetIVTPeriodicEffectDefinition();
+ TInt T_CreateAndDeleteAsynchronousL();
+ TInt T_SeveralSessionsAsynchronousL();
+ TInt T_ConsecutiveSessionsAsynchronousL();
+ TInt T_PauseEffect();
+ TInt T_ResumeEffect();
+ TInt T_StopEffect();
+ TInt T_StopAllEffects();
+ TInt T_PlayPauseResumeStop();
+ TInt T_ConstantGetters();
+ TInt T_ModifyMagSweepEffectSynchronous();
+ TInt T_ModifyMagSweepEffectAsynchronous();
+ TInt T_ModifyPeriodicEffectSynchronous();
+ TInt T_ModifyPeriodicEffectAsynchronous();
+ TInt T_VibeStatusToS60StatusConversions();
+ TInt T_GetDeviceProperty_TInt_TInt();
+ TInt T_GetDeviceProperty_TInt_TDesC();
+ TInt T_SetDeviceProperty_TInt_TInt();
+ TInt T_SetDeviceProperty_TInt_TDesC();
+ TInt T_GetDeviceCapability_TInt_TInt();
+ TInt T_GetDeviceCapability_TInt_TDesC();
+ TInt T_GetHapticsStatus();
+ TInt T_ObserveHapticsStatus();
+ TInt T_GetHapticsStatusWithReservations();
+ TInt T_ObserveHapticsStatusWithReservations();
+ TInt T_GetHapticsStatusWithSeveralReservations();
+ TInt T_ObserveHapticsStatusWithSeveralReservations();
+ TInt T_GetHapticsStatusWithSeveralClientsOneReservation();
+ TInt T_ObserveHapticsStatusWithSeveralClientsOneReservations();
+ TInt T_CreateStreamingEffect();
+ TInt T_PlayStreamingSample();
+ TInt T_PlayStreamingSampleAsync();
+ TInt T_PlayStreamingSampleWithOffset();
+ TInt T_PlayStreamingSampleWithOffsetAsync();
+ TInt T_DestroyStreamingEffect();
+ TInt T_ObserveActuatorStatus();
+ TInt T_ObserveActuatorStatusAndHapticsStatus();
+ TInt T_PluginMgrTransTimerExpires();
+
+ private: // Data
+ /**
+ * Haptics client instance. Owned.
+ */
+ CHWRMHaptics* iHaptics;
+
+ /**
+ * Used to control tests, which are observing haptics status using
+ * status callback.
+ */
+ CActiveSchedulerWait iWait;
+
+ /**
+ * Async play-with-handle methods sender.
+ * Owned.
+ */
+ MT_HapticsTestAsyncPlaySender* iSender;
+
+ public: // Friend classes
+ //?friend_class_declaration;
+ protected: // Friend classes
+ //?friend_class_declaration;
+ private: // Friend classes
+ //?friend_class_declaration;
+ };
+
+#endif // HAPTICSCLIENTTEST_H
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/inc/trace.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,617 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Trace macro definitions.
+*
+*/
+
+#ifndef TRACE_H
+#define TRACE_H
+
+#include <e32base.h> // TCleanupItem
+#include "traceconfiguration.hrh"
+
+#ifdef TRACE_INTO_FILE
+#include <flogger.h> // RFileLogger
+#else
+#include <e32debug.h> // RDebug
+#endif
+
+//-----------------------------------------------------------------------------
+// Constants
+//-----------------------------------------------------------------------------
+//
+
+// NOTE!
+// Replace all COMPONENT_NAME occurnaces with your own component / module name.
+
+/**
+* Prefix trace macro to complete tracing with component name.
+* Returns TDesC which can be used directly with RDebug or RFileLogger.
+*/
+#define _PREFIX_TRACE( aMsg ) TPtrC( (const TText*)L"[HapticsClientTest]: " L##aMsg )
+
+/**
+* Prefix error trace
+*/
+#define _PREFIX_ERROR( aMsg ) _PREFIX_TRACE( "[ERROR: %d]: " L##aMsg )
+
+/**
+* Prefix info trace.
+*/
+#define _PREFIX_INFO( aMsg ) _PREFIX_TRACE( "[INFO]: " L##aMsg )
+
+/**
+* Prefix macro for strings
+*/
+#define _PREFIX_CHAR( aMsg ) (const char*)"[HapticsClientTest]: " ##aMsg
+
+/**
+* Define needed directories if TRACE_INTO_FILE macro in use
+*/
+#ifdef TRACE_INTO_FILE
+
+ _LIT( KDir, "HapticsClientTest" );
+ _LIT( KFile, "HapticsClientTest.txt" );
+ _LIT( KFullPath, "c:\\logs\\HapticsClientTest\\" );
+
+#endif
+
+//-----------------------------------------------------------------------------
+// Error trace macros
+//-----------------------------------------------------------------------------
+//
+#ifdef ERROR_TRACE
+
+ /**
+ * Error trace definitions.
+ */
+ #ifdef TRACE_INTO_FILE
+
+ #define ERROR( aErr, aMsg )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr );\
+ }\
+ }
+ #define ERROR_1( aErr, aMsg, aP1 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1 );\
+ }\
+ }
+ #define ERROR_2( aErr, aMsg, aP1, aP2 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1, aP2 );\
+ }\
+ }
+ #define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3 );\
+ }\
+ }
+ #define ERROR_4( aErr, aMsg, aP1, aP2, aP3, aP4 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3, aP4 );\
+ }\
+ }
+ #define ERROR_5( aErr, aMsg, aP1, aP2, aP3, aP4, aP5 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3, aP4, aP5 );\
+ }\
+ }
+ #define ERROR_6( aErr, aMsg, aP1, aP2, aP3, aP4, aP5, aP6 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3, aP4, aP5 );\
+ }\
+ }
+ #define TEST_ASSERT_DESC( aCondition, aDescription ) \
+ {\
+ if ( aCondition )\
+ {\
+ }\
+ else\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aDescription ) );\
+ }\
+ }
+ #else//TRACE_INTO_FILE not defined
+
+ #define ERROR( aErr, aMsg )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RDebug::Print( _PREFIX_ERROR( aMsg ), aErr );\
+ }\
+ }
+ #define ERROR_1( aErr, aMsg, aP1 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1 );\
+ }\
+ }
+ #define ERROR_2( aErr, aMsg, aP1, aP2 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1, aP2 );\
+ }\
+ }
+ #define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3 );\
+ }\
+ }
+ #define ERROR_4( aErr, aMsg, aP1, aP2, aP3, aP4 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3, aP4 );\
+ }\
+ }
+ #define ERROR_5( aErr, aMsg, aP1, aP2, aP3, aP4, aP5 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3, aP4, aP5 );\
+ }\
+ }
+ #define ERROR_6( aErr, aMsg, aP1, aP2, aP3, aP4, aP5, aP6 )\
+ {\
+ if( aErr < KErrNone )\
+ {\
+ RDebug::Print( _PREFIX_ERROR( aMsg ), aErr, aP1, aP2, aP3, aP4, aP5, aP6 );\
+ }\
+ }
+ #define TEST_ASSERT_DESC( aCondition, aDescription ) \
+ {\
+ if ( aCondition )\
+ {\
+ }\
+ else\
+ {\
+ RDebug::Print( _PREFIX_INFO( aDescription ) );\
+ }\
+ }
+
+ #endif//TRACE_INTO_FILE
+
+ #define ERROR_GEN( aMsg ) ERROR( KErrGeneral, aMsg )
+ #define ERROR_GEN_1( aMsg, aP1 ) ERROR_1( KErrGeneral, aMsg, aP1 )
+ #define ERROR_GEN_2( aMsg, aP1, aP2 ) ERROR_2( KErrGeneral, aMsg, aP1, aP2 )
+ #define ERROR_GEN_3( aMsg, aP1, aP2, aP3 ) ERROR_3( KErrGeneral, aMsg, aP1, aP3 )
+ #define ERROR_GEN_4( aMsg, aP1, aP2, aP3, aP4 ) ERROR_4( KErrGeneral, aMsg, aP1, aP3, aP4 )
+ #define ERROR_GEN_5( aMsg, aP1, aP2, aP3, aP4, aP5 ) ERROR_5( KErrGeneral, aMsg, aP1, aP3, aP4, aP5 )
+ #define ERROR_GEN_6( aMsg, aP1, aP2, aP3, aP4, aP5, aP6 ) ERROR_6( KErrGeneral, aMsg, aP1, aP3, aP4, aP5, aP6 )
+
+#else//ERROR_TRACE not defined
+
+ #define ERROR( aErr, aMsg )
+ #define ERROR_1( aErr, aMsg, aP1 )
+ #define ERROR_2( aErr, aMsg, aP1, aP2 )
+ #define ERROR_3( aErr, aMsg, aP1, aP2, aP3 )
+ #define ERROR_4( aErr, aMsg, aP1, aP2, aP3, aP4 )
+ #define ERROR_5( aErr, aMsg, aP1, aP2, aP3, aP4, aP5 )
+ #define ERROR_6( aErr, aMsg, aP1, aP2, aP3, aP4, aP5, aP6 )
+ #define TEST_ASSERT_DESC( aCondition, aDescription )
+
+ #define ERROR_GEN( aMsg )
+ #define ERROR_GEN_1( aMsg, aP1 )
+ #define ERROR_GEN_2( aMsg, aP1, aP2 )
+ #define ERROR_GEN_3( aMsg, aP1, aP2, aP3 )
+ #define ERROR_GEN_4( aMsg, aP1, aP2, aP3, aP4 )
+ #define ERROR_GEN_5( aMsg, aP1, aP2, aP3, aP4, aP5 )
+ #define ERROR_GEN_6( aMsg, aP1, aP2, aP3, aP4, aP5, aP6 )
+ #define TEST_ASSERT_DESC_GEN( aCondition, aDescription )
+
+ #endif//ERROR_TRACE
+
+//-----------------------------------------------------------------------------
+// TRAP and trace with error macro
+//-----------------------------------------------------------------------------
+//
+#define TRAP_ERROR( aErr, aFunction )\
+ {\
+ TRAP( aErr, aFunction );\
+ TPtrC8 file( ( TText8* )__FILE__ );\
+ ERROR_2( aErr, "Trapped leave in '%S' line %d", &file, __LINE__);\
+ }
+
+//-----------------------------------------------------------------------------
+// Info trace macros
+//-----------------------------------------------------------------------------
+//
+#ifdef INFO_TRACE
+
+ /**
+ * Info log message definitions.
+ */
+ #ifdef TRACE_INTO_FILE
+
+ #define INFO( aMsg )\
+ {\
+ RFileLogger::Write( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ) );\
+ }
+ #define INFO_1( aMsg, aP1 )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1 );\
+ }
+ #define INFO_2( aMsg, aP1, aP2 )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2 );\
+ }
+ #define INFO_3( aMsg, aP1, aP2, aP3 )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2, aP3 );\
+ }
+ #define INFO_4( aMsg, aP1, aP2, aP3, aP4 )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4 );\
+ }
+ #define INFO_5( aMsg, aP1, aP2, aP3, aP4, aP5 )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4, aP5 );\
+ }
+ #define INFO_6( aMsg, aP1, aP2, aP3, aP4, aP5, aP6 )\
+ {\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4, aP5, aP6 );\
+ }
+
+ #else//TRACE_INTO_FILE not defined
+
+ #define INFO( aMsg )\
+ {\
+ RDebug::Print( _PREFIX_INFO( aMsg ) );\
+ }
+ #define INFO_1( aMsg, aP1 )\
+ {\
+ RDebug::Print( _PREFIX_INFO( aMsg ), aP1 );\
+ }
+ #define INFO_2( aMsg, aP1, aP2 )\
+ {\
+ RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2 );\
+ }
+ #define INFO_3( aMsg, aP1, aP2, aP3 )\
+ {\
+ RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3 );\
+ }
+ #define INFO_4( aMsg, aP1, aP2, aP3, aP4 )\
+ {\
+ RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4 );\
+ }
+ #define INFO_5( aMsg, aP1, aP2, aP3, aP4, aP5 )\
+ {\
+ RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4, aP5 );\
+ }
+ #define INFO_6( aMsg, aP1, aP2, aP3, aP4, aP5, aP6 )\
+ {\
+ RDebug::Print( _PREFIX_INFO( aMsg ), aP1, aP2, aP3, aP4, aP5, aP6 );\
+ }
+
+ #endif//TRACE_INTO_FILE
+
+#else//INFO_TRACE not defined
+
+ #define INFO( aMsg )
+ #define INFO_1( aMsg, aP1 )
+ #define INFO_2( aMsg, aP1, aP2 )
+ #define INFO_3( aMsg, aP1, aP2, aP3 )
+ #define INFO_4( aMsg, aP1, aP2, aP3, aP4 )
+ #define INFO_5( aMsg, aP1, aP2, aP3, aP4, aP5 )
+ #define INFO_6( aMsg, aP1, aP2, aP3, aP4, aP5, aP6 )
+
+#endif//INFO_TRACE
+
+//-----------------------------------------------------------------------------
+// Trace current client thread name and process id
+//-----------------------------------------------------------------------------
+//
+#ifdef CLIENT_TRACE
+
+ #define CLIENT_PROCESS\
+ {\
+ CLIENT_PROCESS_PREFIX( "" );\
+ }
+
+ #define CLIENT_PROCESS_PREFIX( aPrefix )\
+ {\
+ RProcess process;\
+ TPtrC name( process.Name() );\
+ TSecureId sid( process.SecureId() );\
+ TPtrC prefix( _S( aPrefix ) );\
+ if( prefix.Length() )\
+ {\
+ INFO_3( "%S: CLIENT - Name: [%S], Sid: [0x%x]", &prefix, &name, sid.iId );\
+ }\
+ else\
+ {\
+ INFO_2( "CLIENT - Name: [%S], Sid: [0x%x]", &name, sid.iId );\
+ }\
+ process.Close();\
+ }
+
+ #define CLIENT_MESSAGE( aMsg )\
+ {\
+ CLIENT_MESSAGE_PREFIX( "", aMsg );\
+ }
+
+ #define CLIENT_MESSAGE_PREFIX( aPrefix, aMsg )\
+ {\
+ RThread thread;\
+ TInt err = aMsg.Client( thread );\
+ if( err == KErrNone )\
+ {\
+ RProcess process;\
+ err = thread.Process( process );\
+ if( err == KErrNone )\
+ {\
+ TPtrC threadName( thread.Name() );\
+ TUid processUid( process.SecureId() );\
+ TPtrC prefix( _S( aPrefix ) );\
+ if( prefix.Length() )\
+ {\
+ INFO_4( "%S: MSG - Name: [%S], Sid: [0x%x], Message ID: [%d]",\
+ &prefix,\
+ &threadName,\
+ processUid,\
+ aMsg.Function() );\
+ }\
+ else\
+ {\
+ INFO_3( "MSG - Name: [%S], Sid: [0x%x], Message ID: [%d]",\
+ &threadName,\
+ processUid,\
+ aMsg.Function() );\
+ }\
+ }\
+ process.Close();\
+ }\
+ thread.Close();\
+ }
+
+#else
+
+ #define CLIENT_PROCESS
+ #define CLIENT_PROCESS_PREFIX( aPrefix )
+ #define CLIENT_MESSAGE( aMsg )
+ #define CLIENT_MESSAGE_PREFIX( aPrefix, aMsg )
+
+#endif
+
+//-----------------------------------------------------------------------------
+// Function trace macros
+//-----------------------------------------------------------------------------
+//
+#ifdef FUNC_TRACE
+
+ /**
+ * Function logging definitions.
+ */
+ #ifdef TRACE_INTO_FILE
+
+ #define FUNC( aMsg, aP1 )\
+ {\
+ TPtrC8 trace( _S8( aMsg ) );\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, trace, aP1 );\
+ }\
+
+ #else//TRACE_INTO_FILE not defined
+
+ #define FUNC( aMsg, aP1 )\
+ {\
+ RDebug::Printf( aMsg, aP1 );\
+ }\
+
+ #endif//TRACE_INTO_FILE
+
+ /**
+ * Function trace helper class.
+ *
+ * NOTE:
+ * LC -methods cannot be trapped. Therefore if LC -method leaves
+ * END trace is used instead of LEAVE trace.
+ * If you have an idea how to round this problem please tell.
+ */
+ _LIT8( KFuncNameTerminator, "(" );
+ _LIT8( KFuncLeavePatternL, "L" );
+ class TFuncLog
+ {
+ public:
+ static void Cleanup( TAny* aPtr )
+ {
+ TFuncLog* self = static_cast< TFuncLog* >( aPtr );
+ self->iLeft = ETrue;
+ FUNC( _PREFIX_CHAR("%S-LEAVE"), &self->iFunc ); // Leave detected
+ }
+ inline TFuncLog( const char* aFunc ) :
+ iFunc( aFunc ? _S8( aFunc ) : _S8("") ),
+ iLeft( EFalse ),
+ iCleanupItem( Cleanup, this ),
+ iCanLeave( EFalse )
+ {
+ TInt pos( iFunc.Find( KFuncNameTerminator ) );
+ if( pos != KErrNotFound )
+ {
+ iFunc.Set( iFunc.Left( pos ) );
+ iCanLeave = !iFunc.Right( KFuncLeavePatternL().Length() ).Compare( KFuncLeavePatternL );
+ if ( iCanLeave )
+ {
+ CleanupStack::PushL( iCleanupItem ); // Ignore warnings
+ }
+ }
+ FUNC( _PREFIX_CHAR("%S-START"), &iFunc );
+ }
+
+ inline ~TFuncLog()
+ {
+ if ( !iLeft )
+ {
+ if ( iCanLeave )
+ {
+ CleanupStack::Pop( this ); // Pop the cleanup item
+ }
+ FUNC( _PREFIX_CHAR("%S-END"), &iFunc ); // Normally finished
+ }
+ }
+
+ private: // Data
+ TPtrC8 iFunc;
+ TBool iLeft;
+ TCleanupItem iCleanupItem;
+ TBool iCanLeave;
+ };
+ #define FUNC_LOG TFuncLog _fl( __PRETTY_FUNCTION__ );
+
+#else//FUNC_TRACE not defined
+
+ #define FUNC_LOG
+
+#endif//FUNC_TRACE
+
+//-----------------------------------------------------------------------------
+// Timestamp trace macros
+//-----------------------------------------------------------------------------
+//
+#ifdef TIMESTAMP_TRACE
+
+ #ifdef TRACE_INTO_FILE
+
+ #define TIMESTAMP( aCaption )\
+ {\
+ TTime t;\
+ t.HomeTime();\
+ TDateTime dt = t.DateTime();\
+ _LIT( KCaption, aCaption );\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend,\
+ _PREFIX_TRACE("[TIMESTAMP] %S %d:%02d:%02d.%d us"),\
+ &KCaption, dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond() );\
+ }
+
+ #else//TRACE_INTO_FILE not defined
+
+ #define TIMESTAMP( aCaption )\
+ {\
+ TTime t;\
+ t.HomeTime();\
+ TDateTime dt = t.DateTime();\
+ _LIT( KCaption, aCaption );\
+ RDebug::Print( _PREFIX_TRACE("[TIMESTAMP] %S %d:%02d:%02d.%d us"),\
+ &KCaption, dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond() );\
+ }
+
+ #endif//TRACE_INTO_FILE
+
+#else//TIMESTAMP_TRACE not defined
+
+ #define TIMESTAMP( aCaption )
+
+#endif//TIMESTAMP_TRACE
+
+#ifdef HEAP_TRACE
+
+ #ifdef TRACE_INTO_FILE
+
+ #define HEAP( aMsg )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_HEAP( aMsg ), totalAllocSpace );\
+ }
+ #define HEAP_1( aMsg, aP1 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1 );\
+ }
+ #define HEAP_2( aMsg, aP1, aP2 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1, aP2 );\
+ }
+ #define HEAP_3( aMsg, aP1, aP2, aP3 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1, aP2, aP3 );\
+ }
+ #define HEAP_4( aMsg, aP1, aP2, aP3, aP4 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RFileLogger::WriteFormat( KDir, KFile, EFileLoggingModeAppend, _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1, aP2, aP3, aP4 );\
+ }
+
+ #else//TRACE_INTO_FILE not defined
+
+ #define HEAP( aMsg )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RDebug::Print( _PREFIX_HEAP( aMsg ), totalAllocSpace );\
+ }
+ #define HEAP_1( aMsg, aP1 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RDebug::Print( _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1 );\
+ }
+ #define HEAP_2( aMsg, aP1, aP2 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RDebug::Print( _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1, aP2 );\
+ }
+ #define HEAP_3( aMsg, aP1, aP2, aP3 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RDebug::Print( _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1, aP2, aP3 );\
+ }
+ #define HEAP_4( aMsg, aP1, aP2, aP3, aP4 )\
+ {\
+ TInt totalAllocSpace = 0;\
+ User::AllocSize( totalAllocSpace );\
+ RDebug::Print( _PREFIX_HEAP( aMsg ), totalAllocSpace, aP1, aP2, aP3, aP4 );\
+ }
+
+ #endif//TRACE_INTO_FILE
+
+#else//HEAP_TRACE not defined
+
+ #define HEAP( aMsg )
+ #define HEAP_1( aMsg, aP1 )
+ #define HEAP_2( aMsg, aP1, aP2 )
+ #define HEAP_3( aMsg, aP1, aP2, aP3 )
+ #define HEAP_4( aMsg, aP1, aP2, aP3, aP4 )
+
+#endif//HEAP_TRACE
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/inc/traceconfiguration.hrh Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+* Trace Macro Configurations.
+*
+*/
+
+
+#ifndef TRACECONFIGURATION_HRH
+#define TRACECONFIGURATION_HRH
+
+//-----------------------------------------------------------------------------
+// Trace definitions
+//-----------------------------------------------------------------------------
+//
+
+/**
+* Error trace enabled
+*/
+#ifdef _DEBUG
+ #define ERROR_TRACE
+#else
+ #undef ERROR_TRACE
+#endif
+
+/**
+* Info trace enabled
+*/
+#ifdef _DEBUG
+ #define INFO_TRACE
+#else
+ #undef INFO_TRACE
+#endif
+
+/**
+* Timestamp tracing on
+*/
+#ifdef _DEBUG
+ #define TIMESTAMP_TRACE
+#else
+ #undef TIMESTAMP_TRACE
+#endif
+
+/**
+* Tracing current client process and thread
+*/
+#ifdef _DEBUG
+ #define CLIENT_TRACE
+#else
+ #undef CLIENT_TRACE
+#endif
+
+/**
+* Function trace enabled
+*/
+#ifdef _DEBUG
+ #define FUNC_TRACE
+#else
+ #undef FUNC_TRACE
+#endif
+
+/**
+* Tracing into file enabled, default RDebug
+*/
+#undef TRACE_INTO_FILE
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/init/hapticsclienttest.ini Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,187 @@
+#
+# This is STIFTestFramework initialization file
+# Comment lines start with '#'-character.
+# See STIF TestFramework users guide.doc for instructions
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set following test engine settings:
+# - Set Test Reporting mode. TestReportMode's possible values are:
+# + 'Summary': Summary of the tested test cases.
+# + 'Environment': Hardware and software info.
+# + 'TestCases': Test case report.
+# + 'FullReport': Set of all above ones.
+# + Example 'TestReportMode= Summary TestCases'
+#
+# - CreateTestReport setting controls report creation mode
+# + YES, Test report will created.
+# + NO, No Test report.
+#
+# - File path indicates the base path of the test report.
+# - File name indicates the name of the test report.
+#
+# - File format indicates the type of the test report.
+# + TXT, Test report file will be txt type, for example 'TestReport.txt'.
+# + HTML, Test report will be html type, for example 'TestReport.html'.
+#
+# - File output indicates output source of the test report.
+# + FILE, Test report logging to file.
+# + RDEBUG, Test report logging to using rdebug.
+#
+# - File Creation Mode indicates test report overwriting if file exist.
+# + OVERWRITE, Overwrites if the Test report file exist.
+# + APPEND, Continue logging after the old Test report information if
+# report exist.
+# - Sets a device reset module's dll name(Reboot).
+# + If Nokia specific reset module is not available or it is not correct one
+# StifHWResetStub module may use as a template for user specific reset
+# module.
+# - Sets STIF test measurement disable options. e.g. pluging1 and pluging2 disablation
+# DisableMeasurement= stifmeasurementplugin01 stifmeasurementplugin02
+#
+
+[Engine_Defaults]
+
+TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment',
+ 'TestCases' or 'FullReport'
+
+CreateTestReport= YES # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT # Possible values: TXT or HTML
+TestReportOutput= FILE # Possible values: FILE or RDEBUG
+TestReportFileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND
+
+DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting
+
+DisableMeasurement= stifmeasurementdisablenone # Possible values are:
+ # 'stifmeasurementdisablenone', 'stifmeasurementdisableall'
+ # 'stifmeasurementplugin01', 'stifmeasurementplugin02',
+ # 'stifmeasurementplugin03', 'stifmeasurementplugin04',
+ # 'stifmeasurementplugin05' or 'stifbappeaprofiler'
+
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Module configurations start
+# Modules are added between module tags
+# tags. Module name is specified after ModuleName= tag, like
+# ModuleName= XXXXXXXXX
+# Modules might have initialisation file, specified as
+# IniFile= c:\testframework\YYYYYY
+# Modules might have several configuration files, like
+# TestCaseFile= c:\testframework\NormalCases.txt
+# TestCaseFile= c:\testframework\SmokeCases.txt
+# TestCaseFile= c:\testframework\ManualCases.txt
+
+# (TestCaseFile is synonym for old term ConfigFile)
+
+# Following case specifies demo module settings. Demo module
+# does not read any settings from file, so tags
+# IniFile and TestCaseFile are not used.
+# In the simplest case it is enough to specify only the
+# name of the test module when adding new test module
+[New_Module]
+ModuleName= TestScripter
+TestCaseFile= c:\testframework\hapticsclienttest.cfg
+[End_Module]
+
+# Load testmoduleXXX, optionally with initialization file and/or test case files
+#[New_Module]
+#ModuleName= testmodulexxx
+
+#TestModuleXXX used initialization file
+#IniFile= c:\testframework\init.txt
+
+#TestModuleXXX used configuration file(s)
+#TestCaseFile= c:\testframework\testcases1.cfg
+#TestCaseFile= c:\testframework\testcases2.cfg
+#TestCaseFile= c:\testframework\manualtestcases.cfg
+
+#[End_Module]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+# Set STIFTestFramework logging overwrite parameters for Logger.
+# Hardware and emulator environment logging path and styles can
+# be configured from here to overwrite the Logger's implemented values.
+#
+# Settings description:
+# - Indicates option for creation log directory/directories. If log directory/directories
+# is/are not created by user they will make by software.
+# + YES, Create log directory/directories if not allready exist.
+# + NO, Log directory/directories not created. Only created one is used.
+#
+# - Overwrite emulator path setting.
+# + Example: If 'EmulatorBasePath= C:\LOGS\TestFramework\' and in code is defined
+# Logger's path 'D:\LOGS\Module\' with those definition the path
+# will be 'C:\LOGS\TestFramework\LOGS\Module\'
+#
+# - Overwrite emulator's logging format.
+# + TXT, Log file(s) will be txt type(s), for example 'Module.txt'.
+# + HTML, Log file(s) will be html type(s), for example 'Module.html'.
+#
+# - Overwrited emulator logging output source.
+# + FILE, Logging to file(s).
+# + RDEBUG, Logging to using rdebug(s).
+#
+# - Overwrite hardware path setting (Same description as above in emulator path).
+# - Overwrite hardware's logging format(Same description as above in emulator format).
+# - Overwrite hardware's logging output source(Same description as above in emulator output).
+#
+# - File Creation Mode indicates file overwriting if file exist.
+# + OVERWRITE, Overwrites if file(s) exist.
+# + APPEND, Continue logging after the old logging information if file(s) exist.
+#
+# - Will thread id include to the log filename.
+# + YES, Thread id to log file(s) name, Example filename 'Module_b9.txt'.
+# + NO, No thread id to log file(s), Example filename 'Module.txt'.
+#
+# - Will time stamps include the to log file.
+# + YES, Time stamp added to each line in log file(s). Time stamp is
+# for example'12.Nov.2003 115958 LOGGING INFO'
+# + NO, No time stamp(s).
+#
+# - Will line breaks include to the log file.
+# + YES, Each logging event includes line break and next log event is in own line.
+# + NO, No line break(s).
+#
+# - Will event ranking include to the log file.
+# + YES, Event ranking number added to each line in log file(s). Ranking number
+# depends on environment's tics, for example(includes time stamp also)
+# '012 12.Nov.2003 115958 LOGGING INFO'
+# + NO, No event ranking.
+#
+
+[Logger_Defaults]
+
+#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#'
+#NOTE: TestEngine and TestServer logging settings cannot change here
+
+#CreateLogDirectories= YES # Possible values: YES or NO
+
+#EmulatorBasePath= C:\LOGS\TestFramework\
+#EmulatorFormat= HTML # Possible values: TXT or HTML
+#EmulatorOutput= FILE # Possible values: FILE or RDEBUG
+
+#HardwareBasePath= D:\LOGS\TestFramework\
+#HardwareFormat= HTML # Possible values: TXT or HTML
+#HardwareOutput= FILE # Possible values: FILE or RDEBUG
+
+#FileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND
+
+#ThreadIdToLogFile= YES # Possible values: YES or NO
+#WithTimeStamp= YES # Possible values: YES or NO
+#WithLineBreak= YES # Possible values: YES or NO
+#WithEventRanking= YES # Possible values: YES or NO
+
+[End_Logger_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+# End of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/init/hwrmhapticspolicy.ini Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,7 @@
+// This is product specific policy file for Haptics.
+// Not exported by haptics. Products need to include this in builds,
+// if required.
+
+// For example, assuming SID is 0x12345678, add row:
+// 10 0x12345678
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/init/hwrmhapticsuid.ini Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,8 @@
+// This file contains VIDs/SIDs which are allowed to use haptics license key auto setting.
+// If SID is found from this list then related VID is omitted.
+// For example, assuming SID 0x12345678 is allowed, add row (without slash signs):
+//+ SID 0x12345678
+
++ VID 0x101FB657 //Nokia VID
++ SID 0x10003B20 //Window server
++ VID 0x101FB657 //EUnit
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/src/hapticsclienttest.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,4436 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "hapticsclienttest.h"
+#include <e32svr.h>
+#include <StifParser.h>
+#include <Stiftestinterface.h>
+#include <StifItemParser.h>
+#include <limits.h>
+#include "trace.h"
+
+// ---------------------------------------------------------
+// Couple of static TUint8 arrays containing bytes for simple
+// timeline and magsweep effects (that are used in PlayEffect
+// and PlayEffectRepeat method related tests below).
+// These are obtained using VibeTonz Studio's export to C-file
+// functionality.
+// ---------------------------------------------------------
+static const TUint8 Timeline4HapticsMT_ivt[] =
+{
+ 0x01, 0x00, 0x02, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x00, 0x07, 0x00, 0xf1, 0xe0, 0x01, 0xe2,
+ 0x00, 0x00, 0xff, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f,
+ 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x12, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x65, 0x00,
+ 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x67, 0x00,
+ 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00
+};
+
+static const TUint8 Magsweep4HapticsMT_ivt[] =
+{
+ 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x81, 0x00, 0x00, 0x4d, 0x00, 0x61, 0x00,
+ 0x67, 0x00, 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x00, 0x00
+};
+
+static const TUint8 Periodic4HapticsMT_ivt[] =
+{
+ 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x81, 0x00, 0x00, 0x50, 0x00, 0x65, 0x00,
+ 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00
+};
+
+// | Object name | Type | Duration | Magnitude | Period |
+//--------------------------------------------------------------
+// 1. | Timeline1 | Timeline | 3915 | | |
+// 2. | Timeline2 | Timeline | 5806 | | |
+// 3. | Periodic1 | Periodic | 1000 | 7480 | 100 |
+// 4. | Periodic2 | Periodic | 2000 | 7480 | 100 |
+// 5. | MagSweep1 | MagSweep | 3000 | 7480 | |
+// 6. | MagSweep2 | MagSweep | 4000 | 7480 | |
+// -------------------------------------------------------------
+static const TUint8 EffectSetMT_ivt[] =
+{
+ 0x01, 0x00, 0x06, 0x00, 0x66, 0x00, 0x84, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x2a, 0x00,
+ 0x3a, 0x00, 0x4a, 0x00, 0xf1, 0xe0, 0x02, 0xe2, 0x00, 0x00, 0xf1, 0xe0, 0x04, 0xe2, 0x03, 0x93,
+ 0xff, 0xf1, 0xe0, 0x03, 0xe2, 0x00, 0x00, 0xf1, 0xe0, 0x05, 0xe2, 0x07, 0x0e, 0xff, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x81, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7d, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x01, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xbb, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x81, 0x30, 0xc8,
+ 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfa, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x14, 0x00, 0x28, 0x00, 0x3c, 0x00, 0x50, 0x00, 0x64, 0x00, 0x54, 0x00, 0x69, 0x00, 0x6d, 0x00,
+ 0x65, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x31, 0x00, 0x00, 0x00, 0x54, 0x00,
+ 0x69, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x32, 0x00,
+ 0x00, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00,
+ 0x63, 0x00, 0x31, 0x00, 0x00, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00,
+ 0x64, 0x00, 0x69, 0x00, 0x63, 0x00, 0x32, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x61, 0x00, 0x67, 0x00,
+ 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x31, 0x00, 0x00, 0x00, 0x4d, 0x00,
+ 0x61, 0x00, 0x67, 0x00, 0x53, 0x00, 0x77, 0x00, 0x65, 0x00, 0x65, 0x00, 0x70, 0x00, 0x32, 0x00,
+ 0x00, 0x00
+};
+
+static const TUint8 CorruptedMT_ivt[] =
+{
+ 0x00, 0x01, 0x01, 0x01, 0x12, 0x00, 0x14, 0x00, 0x00, 0x00, 0x30, 0xc8, 0x00, 0xc8, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x3e, 0x00, 0x00, 0x5f, 0x81, 0x3e, 0x81, 0x00, 0x00, 0x50, 0x00, 0x65, 0x00,
+ 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00
+};
+
+//offset value for
+const TInt KEventOffset = 1000;
+
+// imaginary license key
+_LIT8( KPlainKey, "73JJNDJ38EKDKD983783JDJD84U48DJ4" );
+
+// ---------------------------------------------------------
+// VibeStatus to S60 status mappings are tested by sending these
+// special repeat values to server (calling PlayEffectRepeat).
+// The test plugin will acknowledge these special values and
+// returns corresponding VibeStatus error code..
+// ---------------------------------------------------------
+//
+enum repeat_values_4_vibestatustests
+ {
+ SUCCESS_TEST = 100,
+ ALREADY_INITIALIZED_TEST,
+ NOT_INITIALIZED_TEST,
+ INVALID_ARGUMENT_TEST,
+ FAIL_TEST,
+ INCOMPATIBLE_EFFECT_TYPE_TEST,
+ INCOMPATIBLE_CAPABILITY_TYPE_TEST,
+ INCOMPATIBLE_PROPERTY_TYPE_TEST,
+ DEVICE_NEEDS_LICENSE_TEST,
+ NOT_ENOUGH_MEMORY_TEST,
+ SERVICE_NOT_RUNNING_TEST,
+ INSUFFICIENT_PRIORITY_TEST,
+ SERVICE_BUSY_TEST,
+ WRN_NOT_PLAYING_TEST,
+ WRN_INSUFFICIENT_PRIORITY_TEST
+ };
+
+
+// - Haptics status callback implementation ---------------------------------
+THapticsStatusCallback::THapticsStatusCallback( CHapticsClientTest* aMTCallback )
+ : iHapticsStatus( MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ iMTCallback( aMTCallback )
+ {
+ }
+
+THapticsStatusCallback::~THapticsStatusCallback()
+ {
+ }
+
+MHWRMHapticsObserver::THWRMHapticsStatus THapticsStatusCallback::Status()
+ {
+ return iHapticsStatus;
+ }
+
+// ---------------------------------------------------------
+// from MHWRMHapticsObserver. Method which is called
+// by the haptics client, when the haptics status of
+// that client changes.
+// ---------------------------------------------------------
+//
+void THapticsStatusCallback::HapticsStatusChangedL( THWRMHapticsStatus aStatus )
+ {
+ iHapticsStatus = aStatus;
+
+ // inform callback of new value
+ iMTCallback->HapticsStatusReceived();
+ }
+
+// ---------------------------------------------------------
+// from MHWRMHapticsObserver. Method is for future use,
+// hence the empty implementation.
+// ---------------------------------------------------------
+//
+void THapticsStatusCallback::EffectCompletedL( TInt /*aError*/, TInt /*aEffectHandle*/ )
+ {
+ }
+
+
+// - Actuator status callback implementation ---------------------------------
+TActuatorStatusCallback::TActuatorStatusCallback( CHapticsClientTest* aMTCallback ) : iMTCallback( aMTCallback )
+ {
+ }
+
+TActuatorStatusCallback::~TActuatorStatusCallback()
+ {
+ iActuatorStatus.Close();
+ }
+
+MHWRMHapticsActuatorObserver::THWRMActuatorEvents TActuatorStatusCallback::Status( THWRMLogicalActuators aActuator )
+ {
+ TInt index = iActuatorStatus.Find( aActuator );
+ if ( index == KErrNotFound )
+ {
+ return (MHWRMHapticsActuatorObserver::THWRMActuatorEvents)0;
+ }
+ return (MHWRMHapticsActuatorObserver::THWRMActuatorEvents)(iActuatorStatus[index+1]-KEventOffset);
+ }
+
+// ---------------------------------------------------------
+// from MHWRMHapticsObserver. Method which is called
+// by the haptics client, when the haptics status of
+// that client changes.
+// ---------------------------------------------------------
+//
+void TActuatorStatusCallback::ActuatorEventL( THWRMActuatorEvents aEvent,
+ THWRMLogicalActuators aActuator )
+ {
+ TInt index = iActuatorStatus.Find( aActuator );
+ if ( index == KErrNotFound )
+ {
+ iActuatorStatus.Append( aActuator );
+ iActuatorStatus.Append( aEvent + KEventOffset );
+ }
+ else
+ {
+ iActuatorStatus.Remove( index );
+ iActuatorStatus.Remove( index );
+ iActuatorStatus.Append( aActuator );
+ iActuatorStatus.Append( aEvent + KEventOffset );
+ }
+
+ // inform callback of new value
+ iMTCallback->HapticsStatusReceived();
+ }
+
+// ---------------------------------------------------------
+// MT_HapticsTestAsyncPlaySender methods
+// ---------------------------------------------------------
+//
+MT_HapticsTestAsyncPlaySender::MT_HapticsTestAsyncPlaySender(
+ CHapticsClientTest* aMTCallback )
+ : CActive( EPriorityStandard ), iMTCallback( aMTCallback )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+MT_HapticsTestAsyncPlaySender::~MT_HapticsTestAsyncPlaySender()
+ {
+ }
+
+void MT_HapticsTestAsyncPlaySender::PlayRepeat(
+ CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TUint8 aRepeat,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus )
+ {
+ aClientStatus = KRequestPending;
+ iClientStatus = &aClientStatus;
+ aHaptics->PlayEffectRepeat( aFileHandle,
+ aEffectIndex,
+ aRepeat,
+ aEffectHandle,
+ iStatus );
+ SetActive();
+ }
+
+void MT_HapticsTestAsyncPlaySender::Play(
+ CHWRMHaptics* aHaptics,
+ TInt aFileHandle,
+ TInt aEffectIndex,
+ TInt& aEffectHandle,
+ TRequestStatus& aClientStatus )
+ {
+ aClientStatus = KRequestPending;
+ iClientStatus = &aClientStatus;
+ aHaptics->PlayEffect( aFileHandle,
+ aEffectIndex,
+ aEffectHandle,
+ iStatus );
+ SetActive();
+ }
+
+void MT_HapticsTestAsyncPlaySender::RunL()
+ {
+ *iClientStatus = iStatus.Int();
+ iMTCallback->HapticsStatusReceived();
+ }
+
+void MT_HapticsTestAsyncPlaySender::DoCancel()
+ {
+ }
+
+TInt MT_HapticsTestAsyncPlaySender::RunError( TInt /* aError */ )
+ {
+ return KErrNone;
+ }
+
+// - Construction -----------------------------------------------------------
+
+void CHapticsClientTest::BuildL ()
+ {
+ iSender = new ( ELeave ) MT_HapticsTestAsyncPlaySender( this );
+ }
+
+void CHapticsClientTest::Delete ()
+ {
+ delete iSender;
+ }
+
+// -----------------------------------------------------------------------------
+// CHapticsClientTest::RunMethodL
+// Run specified method. Contains also table of test mothods and their names.
+// -----------------------------------------------------------------------------
+//
+TInt CHapticsClientTest::RunMethodL(
+ CStifItemParser& aItem )
+ {
+
+ static TStifFunctionInfo const KFunctions[] =
+ {
+ // Copy this line for every implemented function.
+ // First string is the function name used in TestScripter script file.
+ // Second is the actual implementation member function.
+ ENTRY( "Setup", CHapticsClientTest::SetupL ),
+ ENTRY( "Teardown", CHapticsClientTest::Teardown ),
+ ENTRY( "CreateAndDestroy", CHapticsClientTest::T_CreateAndDeleteL ),
+ ENTRY( "SeveralSessions", CHapticsClientTest::T_SeveralSessionsL ),
+ ENTRY( "ConsecutiveSessions", CHapticsClientTest::T_ConsecutiveSessionsL ),
+ ENTRY( "SupportedActuators", CHapticsClientTest::T_SupportedActuators ),
+ ENTRY( "OpenSupportedActuator", CHapticsClientTest::T_OpenSupportedActuator ),
+ ENTRY( "OpenUnsupportedActuator", CHapticsClientTest::T_OpenNotSupportedActuator ),
+ ENTRY( "OpenAllActuators", CHapticsClientTest::T_OpenAllActuators ),
+ ENTRY( "2ClientsOpenActuators", CHapticsClientTest::T_SeveralClientsWithOpenActuatorsL ),
+ ENTRY( "PlayMagSweepSynchData", CHapticsClientTest::T_PlayMagSweepEffectSynchronous ),
+ ENTRY( "PlayMagSweepAsynchData", CHapticsClientTest::T_PlayMagSweepEffectAsynchronous ),
+ ENTRY( "PlayPeriodicSynchData", CHapticsClientTest::T_PlayPeriodicEffectSynchronous ),
+ ENTRY( "PlayPeriodicAsynchData", CHapticsClientTest::T_PlayPeriodicEffectAsynchronous ),
+ ENTRY( "PlayIVTSynchData", CHapticsClientTest::T_PlayIVTEffectWithDirectDataSynchronous ),
+ ENTRY( "PlayIVTAsynchData", CHapticsClientTest::T_PlayIVTEffectWithDirectDataAsynchronous ),
+ ENTRY( "RepeatIVTSynchData", CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataSynchronous ),
+ ENTRY( "RepeatIVTAsynchData", CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataAsynchronous ),
+ ENTRY( "GetEffectState", CHapticsClientTest::T_GetEffectState ),
+ ENTRY( "RepeatIVTSynchDataNonTimeline", CHapticsClientTest::T_PlayNonTimelineIVTEffectRepeatWithDirectDataSynchronous ),
+ ENTRY( "RepeatIVTAsynchDataNonTimeline", CHapticsClientTest::T_PlayNonTimelineIVTEffectRepeatWithDirectDataAsynchronous ),
+ ENTRY( "Zero-repeatIVTSynchData", CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueSynchronous ),
+ ENTRY( "Zero-repeatIVTAsynchData", CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueAsynchronous ),
+ ENTRY( "LoadIVTData", CHapticsClientTest::T_LoadIVTData ),
+ ENTRY( "DeleteIVTData", CHapticsClientTest::T_DeleteIVTData ),
+ ENTRY( "DeleteAllIVTData", CHapticsClientTest::T_DeleteAllIVTData ),
+ ENTRY( "LoadAndDeleteMultiple", CHapticsClientTest::T_LoadAndDeleteIVTData ),
+ ENTRY( "LoadAndDeleteMixed", CHapticsClientTest::T_LoadAndDeleteIVTDataMixed ),
+ ENTRY( "LoadDeletePlaySync", CHapticsClientTest::T_LoadDeletePlaySync ),
+ ENTRY( "LoadDeletePlayAsync", CHapticsClientTest::T_LoadDeletePlayAsync ),
+ ENTRY( "LoadDeletePlayRepeatSync", CHapticsClientTest::T_LoadDeletePlayRepeatSync ),
+ ENTRY( "LoadDeletePlayRepeatAsync", CHapticsClientTest::T_LoadDeletePlayRepeatAsync ),
+ ENTRY( "PlayLoadedIVTSynch", CHapticsClientTest::T_PlayIVTEffectWithLoadedDataSynchronous ),
+ ENTRY( "PlayLoadedIVTAsynch", CHapticsClientTest::T_PlayIVTEffectWithLoadedDataAsynchronous ),
+ ENTRY( "RepeatLoadedIVTSynch", CHapticsClientTest::T_PlayIVTEffectRepeatWithLoadedDataSynchronous ),
+ ENTRY( "RepeatLoadedIVTAsynch", CHapticsClientTest::T_PlayIVTEffectRepeatWithLoadedDataAsynchronous ),
+ ENTRY( "LoadMultipleIVT-data", CHapticsClientTest::T_LoadMultipleIVTData ),
+ ENTRY( "PlayFromMultipleIVT-dataSynch", CHapticsClientTest::T_PlayIVTEffectsFromMultipleIVTDataSynchronous ),
+ ENTRY( "PlayFromMultipleIVT-dataAsynch", CHapticsClientTest::T_PlayIVTEffectsFromMultipleIVTDataAsynchronous ),
+ ENTRY( "PlayRepeatFromMultipleIVT-dataSynch", CHapticsClientTest::T_PlayIVTEffectRepeatFromMultipleIVTDataSynchronous ),
+ ENTRY( "PlayRepeatFromMultipleIVT-dataAsynch", CHapticsClientTest::T_PlayIVTEffectRepeatFromMultipleIVTDataAsynchronous ),
+ ENTRY( "StatusConversions", CHapticsClientTest::T_VibeStatusToS60StatusConversions ),
+ ENTRY( "ReserveAndRelease", CHapticsClientTest::T_ReserveAndReleaseHaptics ),
+ ENTRY( "ReserveSeveralTimes", CHapticsClientTest::T_ReserveHapticsSeveralTimes ),
+ ENTRY( "ReserveNoRelease", CHapticsClientTest::T_ReserveHapticsNoReleaseL ),
+ ENTRY( "ReleaseNoReserve", CHapticsClientTest::T_ReleaseHapticsWithoutReservingFirst ),
+ ENTRY( "ReserveForceNoCoe", CHapticsClientTest::T_ReserveNoAutomaticFocusNotTrusted ),
+ ENTRY( "ReserveReservedHigher", CHapticsClientTest::T_ReserveAlreadyReservedHigherL ),
+ ENTRY( "ReserveReservedLower", CHapticsClientTest::T_ReserveAlreadyReservedLowerL ),
+ ENTRY( "PlayWhenReserved", CHapticsClientTest::T_PlayWhenReservedL ),
+ ENTRY( "GetEffectCount", CHapticsClientTest::T_GetIVTEffectCount ),
+ ENTRY( "GetEffectDuration", CHapticsClientTest::T_GetIVTEffectDuration ),
+ ENTRY( "GetEffectIndexFromName", CHapticsClientTest::T_GetIVTEffectIndexFromName ),
+ ENTRY( "GetEffectType", CHapticsClientTest::T_GetIVTEffectType ),
+ ENTRY( "GetEffectName", CHapticsClientTest::T_GetIVTEffectName ),
+ ENTRY( "GetMagSweepEffectDefinition", CHapticsClientTest::T_GetIVTMagSweepEffectDefinition ),
+ ENTRY( "GetPeriodicEffectDefinition", CHapticsClientTest::T_GetIVTPeriodicEffectDefinition ),
+ ENTRY( "CreateAndDestroyAsynchronous", CHapticsClientTest::T_CreateAndDeleteAsynchronousL ),
+ ENTRY( "SeveralSessionsAsynchronous", CHapticsClientTest::T_SeveralSessionsAsynchronousL ),
+ ENTRY( "ConsecutiveSessionsAsynchronous", CHapticsClientTest::T_ConsecutiveSessionsAsynchronousL),
+ ENTRY( "ConstantGetters", CHapticsClientTest::T_ConstantGetters ),
+ ENTRY( "PauseEffect", CHapticsClientTest::T_PauseEffect ),
+ ENTRY( "ResumeEffect", CHapticsClientTest::T_ResumeEffect),
+ ENTRY( "StopEffect", CHapticsClientTest::T_StopEffect),
+ ENTRY( "StopAllEffects", CHapticsClientTest::T_StopAllEffects ),
+ ENTRY( "PlayPauseResumeStop", CHapticsClientTest::T_PlayPauseResumeStop),
+ ENTRY( "ModifyPlayingMagsweepEffectSynchronous", CHapticsClientTest::T_ModifyMagSweepEffectSynchronous ),
+ ENTRY( "ModifyPlayingMagsweepEffectAsynchronous", CHapticsClientTest::T_ModifyMagSweepEffectAsynchronous ),
+ ENTRY( "ModifyPlayingPeriodicEffectSynchronous", CHapticsClientTest::T_ModifyPeriodicEffectSynchronous ),
+ ENTRY( "ModifyPlayingPeriodicEffectAsynchronous", CHapticsClientTest::T_ModifyPeriodicEffectAsynchronous ),
+ ENTRY( "GetDevicePropertyOfTIntValue", CHapticsClientTest::T_GetDeviceProperty_TInt_TInt ),
+ ENTRY( "GetDevicePropertyOfTDesCValue", CHapticsClientTest::T_GetDeviceProperty_TInt_TDesC ),
+ ENTRY( "SetDevicePropertyOfTIntValue", CHapticsClientTest::T_SetDeviceProperty_TInt_TInt ),
+ ENTRY( "SetDevicePropertyOfTDesCValue", CHapticsClientTest::T_SetDeviceProperty_TInt_TDesC ),
+ ENTRY( "GetDeviceCapabilityOfTIntValue", CHapticsClientTest::T_GetDeviceCapability_TInt_TInt ),
+ ENTRY( "GetDeviceCapabilityOfTDesCValue", CHapticsClientTest::T_GetDeviceCapability_TInt_TDesC ),
+ ENTRY( "FetchStatus", CHapticsClientTest::T_GetHapticsStatus ),
+ ENTRY( "ObserveStatus", CHapticsClientTest::T_ObserveHapticsStatus ),
+ ENTRY( "StatusReservation", CHapticsClientTest::T_GetHapticsStatusWithReservations ),
+ ENTRY( "StatusObserveReservation", CHapticsClientTest::T_ObserveHapticsStatusWithReservations ),
+ ENTRY( "Status2Reservations", CHapticsClientTest::T_GetHapticsStatusWithSeveralReservations ),
+ ENTRY( "StatusObserve2Reservation", CHapticsClientTest::T_ObserveHapticsStatusWithSeveralReservations ),
+ ENTRY( "StatusManyClients", CHapticsClientTest::T_GetHapticsStatusWithSeveralClientsOneReservation ),
+ ENTRY( "StatusObserverManyClients", CHapticsClientTest::T_ObserveHapticsStatusWithSeveralClientsOneReservations ),
+ ENTRY( "CreateStreamingEffect", CHapticsClientTest::T_CreateStreamingEffect ),
+ ENTRY( "PlayStreamingSample", CHapticsClientTest::T_PlayStreamingSample),
+ ENTRY( "PlayStreamingSampleAsync", CHapticsClientTest::T_PlayStreamingSampleAsync),
+ ENTRY( "PlayStreamingSampleWithOffset", CHapticsClientTest::T_PlayStreamingSampleWithOffset),
+ ENTRY( "PlayStreamingSampleWithOffsetAsync", CHapticsClientTest::T_PlayStreamingSampleWithOffsetAsync),
+ ENTRY( "DestroyStreamingEffect", CHapticsClientTest::T_DestroyStreamingEffect),
+ ENTRY( "ActuatorStatus", CHapticsClientTest::T_ObserveActuatorStatus),
+ ENTRY( "ActuatorOrHapticsStatus", CHapticsClientTest::T_ObserveActuatorStatusAndHapticsStatus),
+ ENTRY( "PluginMgrTransTimerExpires", CHapticsClientTest::T_PluginMgrTransTimerExpires),
+ };
+
+ const TInt count = sizeof( KFunctions ) /
+ sizeof( TStifFunctionInfo );
+
+ return RunInternalL( KFunctions, count, aItem );
+
+ }
+
+// ---------------------------------------------------------
+// Method, which is called by the status callback, when a status
+// has been received. Stops the wait loop waiting for a new status.
+// ---------------------------------------------------------
+//
+void CHapticsClientTest::HapticsStatusReceived()
+ {
+ iWait.AsyncStop();
+ }
+
+// - Test methods -----------------------------------------------------------
+
+// ---------------------------------------------------------
+// Default test env construction
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::SetupL()
+ {
+ iHaptics = CHWRMHaptics::NewL( NULL, NULL );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Default test env destruction
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::Teardown()
+ {
+ if( iHaptics )
+ {
+ delete iHaptics;
+ iHaptics = NULL;
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Helper methods for creating various effects
+// ---------------------------------------------------------
+//
+void CHapticsClientTest::CreateMagSweepEffect( CHWRMHaptics::THWRMHapticsMagSweepEffect& aEffect )
+ {
+ aEffect.iDuration = 1000;
+ aEffect.iMagnitude = 5000;
+ aEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleSharp;
+ aEffect.iAttackTime = 0;
+ aEffect.iAttackLevel = 0;
+ aEffect.iFadeTime = 0;
+ aEffect.iFadeLevel = 0;
+ }
+
+void CHapticsClientTest::CreatePeriodicEffect( CHWRMHaptics::THWRMHapticsPeriodicEffect& aEffect )
+ {
+ aEffect.iDuration = 1000;
+ aEffect.iMagnitude = 5000;
+ aEffect.iPeriod = 100;
+ aEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleSharp;
+ aEffect.iAttackTime = 0;
+ aEffect.iAttackLevel = 0;
+ aEffect.iFadeTime = 0;
+ aEffect.iFadeLevel = 0;
+ }
+
+void CHapticsClientTest::CreateIVTEffect( RBuf8& aBuffer, CHWRMHaptics::THWRMHapticsEffectTypes aType)
+ {
+ // Note: only magsweep and timeline IVT effects supported so far..
+ switch ( aType )
+ {
+ case CHWRMHaptics::EHWRMHapticsTypePeriodic:
+ {
+ aBuffer.ReAlloc( sizeof( Periodic4HapticsMT_ivt ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memcpy( tmpPtr, Periodic4HapticsMT_ivt, sizeof( Periodic4HapticsMT_ivt ) );
+ aBuffer.SetLength( sizeof( Periodic4HapticsMT_ivt ) );
+ break;
+ }
+ case CHWRMHaptics::EHWRMHapticsTypeMagSweep:
+ {
+ aBuffer.ReAlloc( sizeof( Magsweep4HapticsMT_ivt ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memcpy( tmpPtr, Magsweep4HapticsMT_ivt, sizeof( Magsweep4HapticsMT_ivt ) );
+ aBuffer.SetLength( sizeof( Magsweep4HapticsMT_ivt ) );
+ break;
+ }
+ case CHWRMHaptics::EHWRMHapticsTypeTimeline:
+ {
+ aBuffer.ReAlloc( sizeof( Timeline4HapticsMT_ivt ) );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memcpy( tmpPtr, Timeline4HapticsMT_ivt, sizeof( Timeline4HapticsMT_ivt ) );
+ aBuffer.SetLength( sizeof( Timeline4HapticsMT_ivt ) );
+ break;
+ }
+ default:
+ break; // no support for other types at the moment
+ }
+ }
+
+
+void CHapticsClientTest::CreateDummyStreamSample( TInt aSize, RBuf8& aBuffer )
+ {
+ aBuffer.ReAlloc( aSize );
+ TUint8* tmpPtr = const_cast<TUint8*>( aBuffer.Ptr() );
+ memset( tmpPtr, 0x00, aSize );
+ aBuffer.SetLength( aSize );
+ }
+
+// ---------------------------------------------------------
+// Open and close haptics client-server session, i.e.
+// create and delete haptics client.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_CreateAndDeleteL()
+ {
+ // create iHaptics instance without observers
+ iHaptics = CHWRMHaptics::NewL( NULL, NULL );
+
+ // the connection has been opened successfully, if iHaptics is valid
+ TEST_ASSERT_DESC( iHaptics, "Haptics client creation failed!");
+
+ // the connection is closed, when iHaptics is deleted
+ delete iHaptics;
+ iHaptics = NULL;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Create several simultaneous sessions to haptics server.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_SeveralSessionsL()
+ {
+ // create haptics instances without observers. This creates
+ // client-server sessions (session instances in the server)
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( NULL, NULL );
+
+ // the connection has been opened successfully, if instances are valid
+ TEST_ASSERT_DESC( haptics1, "First haptics client creation failed!");
+ TEST_ASSERT_DESC( haptics2, "Second haptics client creation failed!");
+ TEST_ASSERT_DESC( haptics3, "Third haptics client creation failed!");
+
+ // delete haptics instances. This removes the sessions from
+ // haptics server, and closes the server, when the last session
+ // is closed
+ delete haptics1; haptics1 = NULL;
+ delete haptics2; haptics2 = NULL;
+ delete haptics3; haptics3 = NULL;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Create several consecutive sessions to haptics server.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ConsecutiveSessionsL()
+ {
+ // Do create and delete three times in a row
+ T_CreateAndDeleteL();
+ T_CreateAndDeleteL();
+ T_CreateAndDeleteL();
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Requests the supported actuators from haptics.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_SupportedActuators()
+ {
+ TUint32 actuators = 0;
+ TInt err = KErrNone;
+ err = iHaptics->SupportedActuators( actuators );
+
+ TEST_ASSERT_DESC( (err == KErrNone), "Error returned from SupportedActuators()!" );
+ TEST_ASSERT_DESC( actuators, "Actuators empty!");
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Opens an actuator, which is supported by haptics.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_OpenSupportedActuator()
+ {
+ TUint32 actuators = 0;
+ TInt err = iHaptics->SupportedActuators( actuators );
+
+ // Open using first supported logical actuator type
+ if( EHWRMLogicalActuatorAny & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+ }
+ else if( EHWRMLogicalActuatorDevice & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+ }
+ else if( EHWRMLogicalActuatorPrimaryDisplay & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorPrimaryDisplay ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type PrimaryDisplay failed!" );
+ }
+ else if( EHWRMLogicalActuatorSecondaryDisplay & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorSecondaryDisplay ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type SecondaryDisplay failed!" );
+ }
+ else if( EHWRMLogicalActuatorGame & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGame ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Game failed!" );
+ }
+ else if( EHWRMLogicalActuatorGameLeft & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameLeft ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type GameLeft failed!" );
+ }
+ else if( EHWRMLogicalActuatorGameRight & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameRight ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type GameRight failed!" );
+ }
+ else if( EHWRMLogicalActuatorExternalVibra & actuators )
+ {
+ TRAPD( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorExternalVibra ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type ExternalVibra failed!" );
+ }
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Attemps to open an actuator, which is NOT supported
+// by haptics.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_OpenNotSupportedActuator()
+ {
+ TUint32 actuators = 0;
+ TInt err = iHaptics->SupportedActuators( actuators );
+
+ TEST_ASSERT_DESC( (err == KErrNone), "Error returned from SupportedActuators()!" );
+
+ // Open using first NOT supported logical actuator type
+ if( !( EHWRMLogicalActuatorAny & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ }
+ else if( !( EHWRMLogicalActuatorDevice & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ }
+ else if( !( EHWRMLogicalActuatorPrimaryDisplay & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorPrimaryDisplay ) );
+ }
+ else if( !( EHWRMLogicalActuatorSecondaryDisplay & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorSecondaryDisplay ) );
+ }
+ else if( !( EHWRMLogicalActuatorGame & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGame ) );
+ }
+ else if( !( EHWRMLogicalActuatorGameLeft & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameLeft ) );
+ }
+ else if( !( EHWRMLogicalActuatorGameRight & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameRight ) );
+ }
+ else if( !( EHWRMLogicalActuatorExternalVibra & actuators ) )
+ {
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorExternalVibra ) );
+ }
+
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Invalid error code value!" );
+ TEST_ASSERT_DESC( (err != KErrNone), "Opening unsupported actuator succeeded!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Attemps to open actuators, using all available logical
+// actuator types.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_OpenAllActuators()
+ {
+ TInt actuatorMask = EHWRMLogicalActuatorPrimaryDisplay | EHWRMLogicalActuatorSecondaryDisplay;
+
+ TRAPD( err, iHaptics->OpenActuatorL( (THWRMLogicalActuators)actuatorMask ) );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Opening actuator with several type mask succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorPrimaryDisplay ) );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type PrimaryDisplay succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorSecondaryDisplay ) );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type SecondaryDisplay succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGame ) );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type Game succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameLeft ) );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type GameLeft succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorGameRight ) );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Opening actuator with type GameRight succeeded!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TEST_ASSERT_DESC( (err == KErrAlreadyExists), "Opening actuator with type Any; wrong error code" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Opening actuator with type Device; wrong error code" );
+
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorExternalVibra ) );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Opening actuator with type ExternalVibra; wrong error code!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Creates a couple of haptic client instances, and opens
+// actuators in both of them.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_SeveralClientsWithOpenActuatorsL()
+ {
+ // create first haptics client instance
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ // create second haptics client instance
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // fetch supported actuator types
+ TUint32 actuators = 0;
+ TInt err = haptics1->SupportedActuators( actuators );
+ TEST_ASSERT_DESC( (err == KErrNone), "Error returned from SupportedActuators()!" );
+
+ // open actuators for both instances using supported types
+ if( EHWRMLogicalActuatorAny & actuators )
+ {
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+ }
+ else
+ {
+ TEST_ASSERT_DESC( EFalse, "Actuator type Any not supported!" );
+ }
+
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Plays a magsweep effect using synchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayMagSweepEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effect;
+ CreateMagSweepEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayMagSweepEffect( effect, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing magsweep effect synchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing magsweep effect synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing magsweep effect synchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Plays a magsweep effect using asynchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayMagSweepEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effect;
+ CreateMagSweepEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayMagSweepEffect( effect, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing magsweep effect asynchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing magsweep effect asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ TInt err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing magsweep effect asynchronously failed! (StopAllPlayingEffects)" );
+
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Plays a periodic effect using synchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayPeriodicEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect effect;
+ CreatePeriodicEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayPeriodicEffect( effect, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing periodic effect synchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing periodic effect returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing periodic effect synchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Plays a periodic effect using synchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayPeriodicEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect effect;
+ CreatePeriodicEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayPeriodicEffect( effect, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing periodic effect asynchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing periodic effect asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ TInt err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing periodic effect asynchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Plays an IVT effect using synchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectWithDirectDataSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playingeffect IVT synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed! (StopAllPlayingEffects)" );
+
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Plays an IVT effect using asynchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectWithDirectDataAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play effect
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffect( effBuf, 0, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect asynchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect asynchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using synchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play the effect (repeat 2 times)
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using asynchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play effect (repeat 2 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect repeatedly asynchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Gets the effect state while an effect:
+// a) is being played
+// b) has been paused
+// c) has been completed (i.e., is not playing any more)
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetEffectState()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effect;
+ CreateMagSweepEffect( effect );
+
+ // play effect
+ TInt effectHandle;
+ TInt err = iHaptics->PlayMagSweepEffect( effect, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (playing returned error)" );
+ TEST_ASSERT_DESC( effectHandle, "GetEffectState failed! (empty effect handle)" );
+
+ // get state
+ TInt effectState;
+ err = iHaptics->GetEffectState( effectHandle, effectState );
+ TEST_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (1st call)" );
+ TEST_ASSERT_DESC( (effectState == CHWRMHaptics::EHWRMHapticsEffectPlaying), "GetEffectState failed! (1st call - wrong state)" );
+
+ // pause the effect and get state
+ err = iHaptics->PausePlayingEffect( effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (Pause)" );
+
+ err = iHaptics->GetEffectState( effectHandle, effectState );
+ TEST_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (2nd call)" );
+ TEST_ASSERT_DESC( (effectState == CHWRMHaptics::EHWRMHapticsEffectPaused), "GetEffectState failed! (2nd call - wrong state)" );
+
+ // stop the effect and get state again
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (StopAllPlayingEffects)" );
+
+ err = iHaptics->GetEffectState( effectHandle, effectState );
+ TEST_ASSERT_DESC( (err == KErrNone), "GetEffectState failed! (3rd call)" );
+ TEST_ASSERT_DESC( (effectState == CHWRMHaptics::EHWRMHapticsEffectNotPlaying), "GetEffectState failed! (3rd call - wrong state)" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using synchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// Since the effect in question is not a timeline effect (in
+// this test we use magsweep effect instead), the effect is
+// played only once.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayNonTimelineIVTEffectRepeatWithDirectDataSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect (try to repeat 2 times.. in practice will only repeat once
+ // due to the effect being non timeline effect)
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect (non-timeline) repeatedly synchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect (non-timeline) repeatedly synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect (non-timeline) repeatedly synchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Plays repeatedly an IVT effect using asynchronous API call.
+// The effect is given as TDes8C& parameter directly to the API call.
+// Since the effect in question is not a timeline effect (in
+// this test we use magsweep effect instead), the effect is
+// played only once.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayNonTimelineIVTEffectRepeatWithDirectDataAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect (try to repeat 2 times.. in practice will only repeat once
+ // due to the effect being non timeline effect)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect (non-timeline) repeatedly asynchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect (non-timeline) repeatedly asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect (non-timeline) repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play the effect (repeat 0 times)
+ TInt effectHandle;
+ TInt err = iHaptics->PlayEffectRepeat( effBuf, 0, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly (zero repeats) synchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly (zero repeats) synchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly (zero repeats) synchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatWithDirectDataWithZeroRepeatValueAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // read timeline effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+
+ // play effect (repeat 0 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 0, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing IVT effect repeatedly (zero repeats) asynchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect repeatedly (zero repeats) asynchronously returned empty effect handle!" );
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy(); // effBuf
+ TInt err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly (zero repeats) asynchronously failed! (StopAllPlayingEffects)" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Loading IVT data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::LoadIVTDataInternal( TInt& aFileHandle,
+ CHWRMHaptics::THWRMHapticsEffectTypes aType,
+ TBool aOpenActuator )
+ {
+ // NOTE: we can use the same IVT data as was used in previous "call PlayXXXEffect()
+ // with direct data cases (i.e., there's no need e.g. to read data from file..)
+
+ // open actuator..
+ if ( aOpenActuator )
+ {
+ T_OpenSupportedActuator();
+ }
+
+ // read effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, aType );
+
+ TInt retVal = iHaptics->LoadEffectData( effBuf, aFileHandle );
+
+ CleanupStack::PopAndDestroy(); // effBuf
+ return retVal;
+ }
+
+TInt CHapticsClientTest::LoadIVTDataInternal( TInt& aFileHandle,
+ const TUint8 aIvtData[],
+ TInt aIvtDataSize,
+ TBool aOpenActuator )
+ {
+ // open actuator..
+ if ( aOpenActuator )
+ {
+ T_OpenSupportedActuator();
+ }
+
+ // read effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ effBuf.ReAlloc( aIvtDataSize );
+ TUint8* tmpPtr = const_cast<TUint8*>( effBuf.Ptr() );
+ memcpy( tmpPtr, aIvtData, aIvtDataSize );
+ effBuf.SetLength( aIvtDataSize );
+
+ TInt retVal = iHaptics->LoadEffectData( effBuf, aFileHandle );
+
+ CleanupStack::PopAndDestroy(); // effBuf
+ return retVal;
+ }
+
+TInt CHapticsClientTest::T_LoadIVTData()
+ {
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (LoadIVTData case)" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Deleting previously loaded IVT data by calling DeleteIVTData
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_DeleteIVTData()
+ {
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (DeleteIVTData case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (DeleteIVTData case)!" );
+
+ err = iHaptics->DeleteEffectData( fileHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Deleting previously loaded IVT data by calling DeleteAllIVTData
+// instead of DeleteIVTData
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_DeleteAllIVTData()
+ {
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (DeleteAllIVTData case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (DeleteAllIVTData case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_LoadAndDeleteIVTData()
+ {
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // delete each IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle1 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+ err = iHaptics->DeleteEffectData( fileHandle2 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+ err = iHaptics->DeleteEffectData( fileHandle3 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // reload IVT-data
+ fileHandle1 = KErrNotFound;
+ fileHandle2 = KErrNotFound;
+ fileHandle3 = KErrNotFound;
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data (mixed order).
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_LoadAndDeleteIVTDataMixed()
+ {
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // delete second IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle2 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // load third IVT-data once more (filehandle should not change)
+ TInt newHandle = KErrNotFound;
+ err3 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ TEST_ASSERT_DESC( (fileHandle3 == newHandle), "Received incorrect filehandle!" );
+
+ // load second IVT-data once more (filehandle should change)
+ newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ TEST_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ fileHandle1 = KErrNotFound;
+ fileHandle2 = KErrNotFound;
+ fileHandle3 = KErrNotFound;
+
+ // reload IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the synchronous play-method.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_LoadDeletePlaySync()
+ {
+ TInt effectHandle = 0;
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ TInt err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle3, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete second IVT-data
+ err = iHaptics->DeleteEffectData( fileHandle2 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ TEST_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffect( fileHandle3, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffect( fileHandle3, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the asynchronous play-method.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_LoadDeletePlayAsync()
+ {
+ TRequestStatus status1 = KRequestPending;
+ TRequestStatus status2 = KRequestPending;
+ TRequestStatus status3 = KRequestPending;
+
+ TInt effectHandle = 0;
+
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ // iHaptics->PlayEffect( fileHandle1, 0, effectHandle, status1 );
+ // LoopForCompletion( status1 );
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status1 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status1 == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ iSender->Play( iHaptics, fileHandle3, 0, effectHandle, status3 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete second IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle2 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ TEST_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status1 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status1.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->Play( iHaptics, fileHandle3, 0, effectHandle, status3 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status3.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status1 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status1.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->Play( iHaptics, fileHandle3, 0, effectHandle, status3 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the synchronous PlayRepeat-method.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_LoadDeletePlayRepeatSync()
+ {
+ TInt effectHandle = 0;
+ TInt repeat = 2;
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ TInt err = iHaptics->PlayEffectRepeat( fileHandle1, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle3, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete second IVT-data
+ err = iHaptics->DeleteEffectData( fileHandle2 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ TEST_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ err = iHaptics->PlayEffectRepeat( fileHandle1, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle3, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ err = iHaptics->PlayEffectRepeat( fileHandle1, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ err = iHaptics->PlayEffectRepeat( fileHandle3, 0, repeat, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Loads and deletes IVT-data. Plays using the filehandles
+// received by calling the asynchronous PlayRepeat-method.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_LoadDeletePlayRepeatAsync()
+ {
+ TRequestStatus status1 = KRequestPending;
+ TRequestStatus status2 = KRequestPending;
+ TRequestStatus status3 = KRequestPending;
+
+ TInt effectHandle = 0;
+ TInt repeat = 7;
+
+ TInt fileHandle1 = KErrNotFound;
+ TInt fileHandle2 = KErrNotFound;
+ TInt fileHandle3 = KErrNotFound;
+
+ // load IVT-data (open actuator on the first load only inside LoadIVTDataInternal())
+ TInt err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic );
+ TInt err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TInt err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, repeat, effectHandle, status1 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status1.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle3, 0, repeat, effectHandle, status3 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete second IVT-data
+ TInt err = iHaptics->DeleteEffectData( fileHandle2 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete IVT data failed!" );
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT data succeeded!" );
+
+ // load second IVT-data once more (filehandle should change)
+ TInt newHandle = KErrNotFound;
+ err2 = LoadIVTDataInternal( newHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( newHandle, "Loading IVT data failed, empty newHandle!" );
+ TEST_ASSERT_DESC( (fileHandle2 != newHandle), "Received incorrect filehandle!" );
+ fileHandle2 = newHandle;
+
+ // play the first effect of the second data
+ status2 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+
+ // delete all IVT-data
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed!" );
+
+ // play the first effect of each data (each should fail, since data is deleted)
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, repeat, effectHandle, status1 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status1.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+ iSender->PlayRepeat( iHaptics, fileHandle3, 0, repeat, effectHandle, status3 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status3.Int() == KErrBadHandle), "Playing deleted IVT-data succeeded!" );
+
+ // load IVT-data
+ err1 = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ err2 = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ err3 = LoadIVTDataInternal( fileHandle3, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err1 == KErrNone), "Loading IVT data1 failed!" );
+ TEST_ASSERT_DESC( (err2 == KErrNone), "Loading IVT data2 failed!" );
+ TEST_ASSERT_DESC( (err3 == KErrNone), "Loading IVT data3 failed!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle1!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle2!" );
+ TEST_ASSERT_DESC( fileHandle3, "Loading IVT data failed, empty fileHandle3!" );
+
+ // check that filehandles are unique
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle3), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle1 != fileHandle2), "Received same filehandles!" );
+ TEST_ASSERT_DESC( (fileHandle2 != fileHandle3), "Received same filehandles!" );
+
+ // play the first effect of each data
+ status1 = KRequestPending;
+ status2 = KRequestPending;
+ status3 = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, repeat, effectHandle, status1 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status1.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, repeat, effectHandle, status2 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status2.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ iSender->PlayRepeat( iHaptics, fileHandle3, 0, repeat, effectHandle, status3 );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status3.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------
+// Playing the previously loaded IVT data (synchronous version)
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectWithLoadedDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing synchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ err = iHaptics->PlayEffect( fileHandle, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing synchronously case))" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Playing the previously loaded IVT data (asynchronous version)
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectWithLoadedDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing asynchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Playing asynchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iSender->Play( iHaptics, fileHandle, 0, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing asynchronously case))" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (synchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatWithLoadedDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT synchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Repeat IVT synchronously case)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ TInt effectHandle;
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, 3, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing repeatedly loaded IVT data failed (synch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT synchronously case))" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (asynchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatWithLoadedDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT asynchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Repeat IVT asynchronously case)!" );
+
+ // play the effect (repeated 5 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, 5, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing repeatedly loaded IVT data failed (asynch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT asynchronously case))" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// VibeStatus to S60 status conversions
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_VibeStatusToS60StatusConversions()
+ {
+ // this is a bit ugly, i.e., we're using special repeat
+ // values and then the test adaptation stub acknowledges
+ // these special value and repeats accordingly with some
+ // (Vibe-error) status
+
+ // load the IVT data
+ TInt fileHandle;
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Status conversion case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Status conversion case)!" );
+
+ // the actual status conversion cases (done with special repeat values
+ // using PlayIVTEffectRepeat)
+ TInt dummyEffectHandle; // we're not interested about this in these cases
+ // first the synch cases..
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, SUCCESS_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Status conversion subcase SUCCESS_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, ALREADY_INITIALIZED_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrAlreadyExists), "Status conversion subcase ALREADY_INITIALIZED_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, NOT_INITIALIZED_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNotReady), "Status conversion subcase NOT_INITIALIZED_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INVALID_ARGUMENT_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Status conversion subcase INVALID_ARGUMENT_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, FAIL_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrGeneral), "Status conversion subcase FAIL_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INCOMPATIBLE_EFFECT_TYPE_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_EFFECT_TYPE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INCOMPATIBLE_CAPABILITY_TYPE_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_CAPABILITY_TYPE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INCOMPATIBLE_PROPERTY_TYPE_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_PROPERTY_TYPE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, DEVICE_NEEDS_LICENSE_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrAccessDenied), "Status conversion subcase DEVICE_NEEDS_LICENSE_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, NOT_ENOUGH_MEMORY_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNoMemory), "Status conversion subcase NOT_ENOUGH_MEMORY_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, SERVICE_NOT_RUNNING_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNotReady), "Status conversion subcase SERVICE_NOT_RUNNING_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrAccessDenied), "Status conversion subcase INSUFFICIENT_PRIORITY_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, SERVICE_BUSY_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Status conversion subcase SERVICE_BUSY_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, WRN_NOT_PLAYING_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Status conversion subcase WRN_NOT_PLAYING_TEST failed (synch)!" );
+
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, WRN_INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Status conversion subcase WRN_INSUFFICIENT_PRIORITY_TEST failed (synch)!" );
+
+ // then the asycnh cases
+ TRequestStatus status;
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, SUCCESS_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Status conversion subcase SUCCESS_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, ALREADY_INITIALIZED_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrAlreadyExists), "Status conversion subcase ALREADY_INITIALIZED_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, NOT_INITIALIZED_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNotReady), "Status conversion subcase NOT_INITIALIZED_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INVALID_ARGUMENT_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrArgument), "Status conversion subcase INVALID_ARGUMENT_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, FAIL_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrGeneral), "Status conversion subcase FAIL_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INCOMPATIBLE_EFFECT_TYPE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_EFFECT_TYPE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INCOMPATIBLE_CAPABILITY_TYPE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_CAPABILITY_TYPE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INCOMPATIBLE_PROPERTY_TYPE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNotSupported), "Status conversion subcase INCOMPATIBLE_PROPERTY_TYPE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, DEVICE_NEEDS_LICENSE_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrAccessDenied), "Status conversion subcase DEVICE_NEEDS_LICENSE_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, NOT_ENOUGH_MEMORY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNoMemory), "Status conversion subcase NOT_ENOUGH_MEMORY_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, SERVICE_NOT_RUNNING_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNotReady), "Status conversion subcase SERVICE_NOT_RUNNING_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrAccessDenied), "Status conversion subcase INSUFFICIENT_PRIORITY_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, SERVICE_BUSY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse), "Status conversion subcase SERVICE_BUSY_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, WRN_NOT_PLAYING_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrArgument), "Status conversion subcase WRN_NOT_PLAYING_TEST failed (asynch)!" );
+
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, WRN_INSUFFICIENT_PRIORITY_TEST, dummyEffectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Status conversion subcase WRN_INSUFFICIENT_PRIORITY_TEST failed (asynch)!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Load multiple IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_LoadMultipleIVTData()
+ {
+ TInt fileHandle;
+ TInt prevFileHandle;
+
+ // load the IVT data
+ TInt err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Load multiple IVT-data case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Load multiple IVT-data case)!" );
+ prevFileHandle = fileHandle;
+
+ // load the IVT data
+ fileHandle = 0;
+ err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeTimeline ,EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Load multiple IVT-data case)!" );
+ TEST_ASSERT_DESC( fileHandle, "Loading IVT data failed, empty fileHandle (Load multiple IVT-data case)!" );
+ TEST_ASSERT_DESC( fileHandle!=prevFileHandle, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // try to load the same IVT data as before
+ fileHandle = 0;
+ err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Load multiple IVT-data case)!" );
+ TEST_ASSERT_DESC( fileHandle == prevFileHandle, "Loading IVT data failed, wrong fileHandle (Load multiple IVT-data case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing synchronously case))" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Playing from multiple IVT data (synchronous version)
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectsFromMultipleIVTDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing synchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing synchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Playing synchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ err = iHaptics->PlayEffect( fileHandle1, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ err = iHaptics->PlayEffect( fileHandle2, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing loaded IVT data failed (synch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ TInt unknownFileHandle = 3;
+ err = iHaptics->PlayEffect( unknownFileHandle, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing loaded IVT data failed, not bad handle (synch)!" );
+ TEST_ASSERT_DESC( !effectHandle, "Playing loaded IVT data failed, not empty effectHandle (synch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing synchronously case))" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Playing the previously loaded IVT data (asynchronous version)
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectsFromMultipleIVTDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing asynchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Playing asynchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Playing asynchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Playing asynchronously case)!" );
+
+ // play the effect..
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+
+ iSender->Play( iHaptics, fileHandle1, 0, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ status = KRequestPending;
+ iSender->Play( iHaptics, fileHandle2, 0, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing loaded IVT data failed (asynch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect..
+ effectHandle = 0;
+ status = KRequestPending;
+ TInt unknownFileHandle = 3;
+ iSender->Play( iHaptics, unknownFileHandle, 0, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrBadHandle), "Playing loaded IVT data failed, not bad handle (asynch)!" );
+ TEST_ASSERT_DESC( !effectHandle, "Playing loaded IVT data failed, not empty effectHandle (asynch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Playing asynchronously case))" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (synchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatFromMultipleIVTDataSynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeTimeline );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT synchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Repeat IVT synchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeTimeline, EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT synchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Repeat IVT synchronously case)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ TInt effectHandle;
+ err = iHaptics->PlayEffectRepeat( fileHandle1, 0, 3, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing repeatedly loaded IVT data failed (synch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ effectHandle = 0;
+ err = iHaptics->PlayEffectRepeat( fileHandle2, 0, 3, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing repeatedly loaded IVT data failed (synch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (synch)!" );
+
+ // play the effect repeatedly (repeated 3 times)
+ effectHandle = 0;
+ TInt unknownFileHandle = 3;
+ err = iHaptics->PlayEffectRepeat( unknownFileHandle, 0, 3, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Playing repeatedly loaded IVT data failed, not bad handle (synch)!" );
+ TEST_ASSERT_DESC( !effectHandle, "Playing repeatedly loaded IVT data failed, not empty effectHandle (synch)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly synchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT synchronously case))" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Playing with repeat the previously loaded IVT data
+// (asynchronous version). Uses timeline effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayIVTEffectRepeatFromMultipleIVTDataAsynchronous()
+ {
+ // load the IVT data
+ TInt fileHandle1;
+ TInt err = LoadIVTDataInternal( fileHandle1, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT asynchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (Repeat IVT asynchronously case)!" );
+
+ // load the IVT data
+ TInt fileHandle2;
+ err = LoadIVTDataInternal( fileHandle2, CHWRMHaptics::EHWRMHapticsTypeMagSweep, EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (Repeat IVT asynchronously case)!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (Repeat IVT asynchronously case)!" );
+
+ // play the effect (repeated 5 times)
+ TInt effectHandle;
+ TRequestStatus status = KRequestPending;
+
+ iSender->PlayRepeat( iHaptics, fileHandle1, 0, 5, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing repeatedly loaded IVT data failed (asynch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect (repeated 5 times)
+ effectHandle = 0;
+ iSender->PlayRepeat( iHaptics, fileHandle2, 0, 5, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Playing repeatedly loaded IVT data failed (asynch)!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing repeatedly loaded IVT data failed, empty effectHandle (asynch)!" );
+
+ // play the effect (repeated 5 times)
+ effectHandle = 0;
+ status = KRequestPending;
+ TInt unknownFileHandle = 3;
+ iSender->PlayRepeat( iHaptics, unknownFileHandle, 0, 5, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrBadHandle), "Playing repeatedly loaded IVT data failed, not bad handle (asynch)!" );
+ TEST_ASSERT_DESC( !effectHandle, "Playing repeatedly loaded IVT data failed, not empty effectHandle (asynch)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect repeatedly asynchronously failed! (StopAllPlayingEffects)" );
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (Repeat IVT asynchronously case))" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Releasing previously reserved haptics
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ReserveAndReleaseHaptics()
+ {
+ // reserve
+ TRAPD( err, iHaptics->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Release haptics case failed (ReserveHapticsL leaves)!" );
+
+ // release (does not return an error code)
+ iHaptics->ReleaseHaptics();
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Reserving haptics several (in this case three) times
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ReserveHapticsSeveralTimes()
+ {
+ TRAPD( err, iHaptics->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics (1st call) failed!" );
+ TRAP( err, iHaptics->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics (2nd call) failed!" );
+ TRAP( err, iHaptics->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics (3rd call) failed!" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Reserving haptics
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ReserveHapticsNoReleaseL()
+ {
+ // create first haptics instance
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ // reserve
+ TRAPD( err, haptics1->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // create second haptics instance and open actuator
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // play an effect using second client (should fail because
+ // of reservation)
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TInt effectHandle = 0;
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although server reserved!" );
+
+ // destroy first client --> should release reservation
+ CleanupStack::PopAndDestroy( haptics1 );
+
+ // play an effect using second client (should succeed, since no
+ // reservation)
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed (no reservation)!" );
+
+ // cleanup
+ effBuf.Close();
+ delete haptics2;
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Releasing haptics when it has not been previously reserved
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ReleaseHapticsWithoutReservingFirst()
+ {
+ // no return values nor leave to check, just execute
+ iHaptics->ReleaseHaptics();
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Tries to reserve haptics with forceNoCoeEnv flag on.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ReserveNoAutomaticFocusNotTrusted()
+ {
+ TRAPD( err, iHaptics->ReserveHapticsL( ETrue ) );
+ TEST_ASSERT_DESC( (err == KErrAccessDenied), "Reservation succeeded although not a trusted client!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Tries to reserve haptics, when it has already been
+// reserved for another client with higher priority.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ReserveAlreadyReservedHigherL()
+ {
+ // create haptics instances and open actuators
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set first client priority (max)
+ haptics1->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+
+ // reserve
+ TRAP( err, haptics1->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // set second client priority (min)
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+
+ // reserve
+ TRAP( err, haptics2->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // play effect using the second client
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TInt effectHandle = 0;
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release first client's reservation
+ haptics1->ReleaseHaptics();
+
+ // play effect using the second client
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release second client's reservation
+ haptics2->ReleaseHaptics();
+
+ // cleanup
+ effBuf.Close();
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Tries to reserve haptics, when it has already been
+// reserved for another client with lower priority.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ReserveAlreadyReservedLowerL()
+ {
+ // create haptics instances and open actuators
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set first client priority (min)
+ haptics1->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+
+ // reserve
+ TRAP( err, haptics1->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // set second client priority (max)
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+
+ // reserve
+ TRAP( err, haptics2->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // play effect using first client
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+ TInt effectHandle = 0;
+ err = haptics1->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // play effect using second client
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release second client
+ haptics2->ReleaseHaptics();
+
+ // play effect using first client
+ err = haptics1->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // play effect using second client
+ err = haptics2->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect failed!" );
+
+ // release first client
+ haptics1->ReleaseHaptics();
+
+ // cleanup
+ effBuf.Close();
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Tries to play effects, when haptics has been reserved
+// for a higher priority client.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayWhenReservedL()
+ {
+ // create haptics instances and open actuators
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TRAP( err, iHaptics->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set first client priority (max)
+ haptics1->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+
+ // reserve for first client
+ TRAP( err, haptics1->ReserveHapticsL() );
+ TEST_ASSERT_DESC( (err == KErrNone), "Reserve haptics failed!" );
+
+ // set second client priority (min)
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+
+ // play effects using second client, when reserved for the first
+ // --->
+
+ // create effect data for playing effect directly using IVT-data
+ RBuf8 effBuf;
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // load the IVT data for playing effects using filehandle
+ TInt fileHandle = 0;
+ err = LoadIVTDataInternal( fileHandle, CHWRMHaptics::EHWRMHapticsTypePeriodic, EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed!" );
+
+ // create a magsweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect magSweepEffect;
+ CreateMagSweepEffect( magSweepEffect );
+
+ // create a periodic effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect periodicEffect;
+ CreatePeriodicEffect( periodicEffect );
+
+ TInt effectHandle = 0;
+ TRequestStatus status = KRequestPending;
+
+ // synchronous play with data
+ err = iHaptics->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous play-repeat with data
+ err = iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play with data
+ status = KRequestPending;
+ iHaptics->PlayEffect( effBuf, 0, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play-repeat with data
+ status = KRequestPending;
+ iHaptics->PlayEffectRepeat( effBuf, 0, 2, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous play with filehandle
+ err = iHaptics->PlayEffect( fileHandle, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous play-repeat with filehandle
+ err = iHaptics->PlayEffectRepeat( fileHandle, 0, 2, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play with filehandle
+ status = KRequestPending;
+ iSender->Play( iHaptics, fileHandle, 0, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous play-repeat with filehandle
+ status = KRequestPending;
+ iSender->PlayRepeat( iHaptics, fileHandle, 0, 2, effectHandle, status );
+ iWait.Start();
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous manual magsweep
+ err = iHaptics->PlayMagSweepEffect( magSweepEffect, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // synchronous manual periodic
+ err = iHaptics->PlayPeriodicEffect( periodicEffect, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous manual magsweep
+ status = KRequestPending;
+ iHaptics->PlayMagSweepEffect( magSweepEffect, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // asynchronous manual periodic
+ status = KRequestPending;
+ iHaptics->PlayPeriodicEffect( periodicEffect, effectHandle, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse), "Playing IVT effect succeeded although reserved!" );
+
+ // <---
+
+ // cleanup
+ effBuf.Close();
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Getting effect count from preloaded IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetIVTEffectCount()
+ {
+ TInt fileHandle1;
+ TInt fileHandle2;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectCount case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectCount case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectCount case)!" );
+ TEST_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectCount case)!" );
+
+ // load the IVT effect set 2
+ err = LoadIVTDataInternal( fileHandle2, Magsweep4HapticsMT_ivt,
+ sizeof( Magsweep4HapticsMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectCount case)!" );
+ TEST_ASSERT_DESC( fileHandle2, "Loading IVT data failed, empty fileHandle (GetIVTEffectCount case)!" );
+
+
+ TInt effectCount;
+ // get effect count from IVT-data 1
+ err = iHaptics->GetEffectCount( fileHandle1, effectCount );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect count failed (GetIVTEffectCount case)!" );
+ TEST_ASSERT_DESC( (effectCount == 6), "Wrong effect count (GetIVTEffectCount case)!" );
+
+ // get effect count from corrupted IVT-data
+ err = iHaptics->GetEffectCount( corruptedFile, effectCount );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Get count from corrupted IVT-data, incorrect error code (GetIVTEffectCount case)!" );
+
+ // get effect count from IVT-data 2
+ err = iHaptics->GetEffectCount( fileHandle2, effectCount );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect count failed (GetIVTEffectCount case)!" );
+ TEST_ASSERT_DESC( (effectCount == 1), "Wrong effect count (GetIVTEffectCount case)!" );
+
+ // get effect count using unknown file handle
+ err = iHaptics->GetEffectCount( unknownFileHandle, effectCount );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectCount case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectCount case))" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Getting effect duration from preloaded IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetIVTEffectDuration()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectDuration case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ TEST_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectDuration case)!" );
+
+ TInt effectDuration;
+ // duration of the last effect
+ TInt index = 5;
+ err = iHaptics->GetEffectDuration( fileHandle1, index, effectDuration );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get duration failed (GetIVTEffectDuration case)!" );
+ TEST_ASSERT_DESC( (effectDuration == 4000), "Wrong duration (GetIVTEffectDuration case)!" );
+
+ // get duration using effect index out of bounds
+ index = 6;
+ err = iHaptics->GetEffectDuration( fileHandle1, index, effectDuration );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get duration succeeded (GetIVTEffectDuration case)!" );
+
+ // get duration from corrupted IVT-data
+ index = 0; err = KErrNone;
+ err = iHaptics->GetEffectDuration( corruptedFile, index, effectDuration );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Get duration from corrupted data, incorrect error code (GetIVTEffectDuration case)!" );
+
+ // duration of the first effect
+ index = 0;
+ err = iHaptics->GetEffectDuration( fileHandle1, index, effectDuration );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get duration failed (GetIVTEffectDuration case)!" );
+ TEST_ASSERT_DESC( (effectDuration == 3915), "Wrong duration (GetIVTEffectDuration case)!" );
+
+ // get duration using unknown file handle
+ index = 0;
+ err = iHaptics->GetEffectDuration( unknownFileHandle, index, effectDuration );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectDuration case)!" );
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectDuration case))" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Getting effect index from preloaded IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetIVTEffectIndexFromName()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetEffectIndexFromName case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetEffectIndexFromName case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetEffectIndexFromName case)!" );
+ TEST_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetEffectIndexFromName case)!" );
+
+
+ TInt effectIndex;
+ _LIT8( KFirstName, "Timeline1" );
+ _LIT8( KLastName, "MagSweep2" );
+ _LIT8( KUnknownName, "Tiline1" );
+ TBuf8<128> effectName;
+
+ // get index of the first name
+ effectName = KFirstName;
+ err = iHaptics->GetEffectIndexFromName( fileHandle1, effectName, effectIndex );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect index failed (GetEffectIndexFromName case)!" );
+ TEST_ASSERT_DESC( (effectIndex == 0), "Wrong effect index (GetEffectIndexFromName case)!" );
+
+ // get index of the last name
+ effectName = KLastName;
+ err = iHaptics->GetEffectIndexFromName( fileHandle1, effectName, effectIndex );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect index failed (GetEffectIndexFromName case)!" );
+ TEST_ASSERT_DESC( (effectIndex == 5), "Wrong effect index (GetEffectIndexFromName case)!" );
+
+ // get index from corrupted IVT-data
+ effectName = KFirstName;
+ err = iHaptics->GetEffectIndexFromName( corruptedFile, effectName, effectIndex );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Get effect index from corrupted data, incorrect error code (GetEffectIndexFromName case)!" );
+
+ // get index using unknown name
+ effectName = KUnknownName;
+ err = iHaptics->GetEffectIndexFromName( fileHandle1, effectName, effectIndex );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get effect succeeded (GetEffectIndexFromName case)!" );
+
+ // get index using unknown file handle
+ effectName = KUnknownName;
+ err = iHaptics->GetEffectIndexFromName( unknownFileHandle, effectName, effectIndex );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetEffectIndexFromName case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetEffectIndexFromName case))" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Getting effect type from preloaded IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetIVTEffectType()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectType case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectType case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectType case)!" );
+ TEST_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectType case)!" );
+
+
+ // get type of the first effect
+ TInt effectType;
+ TInt effectIndex = 0;
+ err = iHaptics->GetEffectType( fileHandle1, effectIndex, effectType );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect type failed (GetIVTEffectType case)!" );
+ TEST_ASSERT_DESC( (effectType == CHWRMHaptics::EHWRMHapticsTypeTimeline), "Wrong effect type (GetIVTEffectType case)!" );
+
+ // get type from corrupted IVT-data
+ effectIndex = 5;
+ err = iHaptics->GetEffectType( corruptedFile, effectIndex, effectType );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Get effect type from corrupted data, incorrect error code (GetIVTEffectType case)!" );
+
+ // get type of the last effect
+ effectIndex = 5;
+ err = iHaptics->GetEffectType( fileHandle1, effectIndex, effectType );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect type failed (GetIVTEffectType case)!" );
+ TEST_ASSERT_DESC( (effectType == CHWRMHaptics::EHWRMHapticsTypeMagSweep), "Wrong effect type (GetIVTEffectType case)!" );
+
+ // get type using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetEffectType( fileHandle1, effectIndex, effectType );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get effect type succeeded (GetIVTEffectType case)!" );
+
+ // get type using unknown file handle
+ effectIndex = 6;
+ err = iHaptics->GetEffectType( unknownFileHandle, effectIndex, effectType );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectType case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectType case))" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Getting effect name from preloaded IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetIVTEffectName()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTEffectName case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTEffectDuration case)!" );
+ TEST_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTEffectName case)!" );
+
+
+ // get name of the first effect
+ TBuf8<128> effectName;
+ TInt effectIndex = 0;
+ _LIT8( KTimeline1, "Timeline1" );
+ _LIT8( KMagSweep2, "MagSweep2" );
+ err = iHaptics->GetEffectName( fileHandle1, effectIndex, effectName );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect name failed (GetIVTEffectName case)!" );
+ TEST_ASSERT_DESC( (effectName == KTimeline1), "Wrong effect name (GetIVTEffectName case)!" );
+
+ // get name from corrupted IVT-data
+ effectIndex = 0;
+ err = iHaptics->GetEffectName( corruptedFile, effectIndex, effectName );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Get effect name from corrupted data, incorrect error code (GetIVTEffectName case)!" );
+
+ // get name of the last effect
+ effectIndex = 5;
+ err = iHaptics->GetEffectName( fileHandle1, effectIndex, effectName );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect name failed (GetIVTEffectName case)!" );
+ TEST_ASSERT_DESC( (effectName == KMagSweep2), "Wrong effect name (GetIVTEffectType case)!" );
+
+ // get name using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetEffectName( fileHandle1, effectIndex, effectName );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get effect name succeeded (GetIVTEffectName case)!" );
+
+ // get name using unknown file handle
+ effectIndex = 0;
+ err = iHaptics->GetEffectName( unknownFileHandle, effectIndex, effectName );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTEffectName case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTEffectName case))" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Getting MagSweep effect definition from preloaded IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetIVTMagSweepEffectDefinition()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTMagSweepEffectDefinition case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTMagSweepEffectDefinition case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTMagSweepEffectDefinition case)!" );
+ TEST_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTMagSweepEffectDefinition case)!" );
+
+
+ // get definition of the first MagSweep effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect effectDefinition;
+ TInt effectIndex = 4;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTMagSweepEffectDefinition case)!" );
+ TEST_ASSERT_DESC( (effectDefinition.iDuration == 3000), "Wrong effect definition (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition from corrupted IVT-data
+ effectIndex = 0;
+ err = iHaptics->GetMagSweepEffectDefinition( corruptedFile, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Get effect definition from corrupted data, incorrect error code (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition of the last MagSweep effect
+ effectIndex = 5;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTMagSweepEffectDefinition case)!" );
+ TEST_ASSERT_DESC( (effectDefinition.iDuration == 4000), "Wrong effect definition (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition using effect index not pointing to MagSweep effect
+ effectIndex = 2;
+ err = iHaptics->GetMagSweepEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTMagSweepEffectDefinition case)!" );
+
+ // get definition using unknown file handle
+ effectIndex = 0;
+ err = iHaptics->GetMagSweepEffectDefinition( unknownFileHandle, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTMagSweepEffectDefinition case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTMagSweepEffectDefinition case))" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Getting Periodic effect definition from preloaded IVT-data
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetIVTPeriodicEffectDefinition()
+ {
+ TInt fileHandle1;
+ TInt corruptedFile;
+ TInt unknownFileHandle = 9;
+
+ // load the IVT effect set 1
+ TInt err = LoadIVTDataInternal( fileHandle1, EffectSetMT_ivt,
+ sizeof( EffectSetMT_ivt ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTPeriodicEffectDefinition case)!" );
+ TEST_ASSERT_DESC( fileHandle1, "Loading IVT data failed, empty fileHandle (GetIVTPeriodicEffectDefinition case)!" );
+
+ // load corrupted IVT effect set
+ err = LoadIVTDataInternal( corruptedFile, CorruptedMT_ivt,
+ sizeof( CorruptedMT_ivt ), EFalse );
+ TEST_ASSERT_DESC( (err == KErrNone), "Loading IVT data failed (GetIVTPeriodicEffectDefinition case)!" );
+ TEST_ASSERT_DESC( corruptedFile, "Loading IVT data failed, empty fileHandle (GetIVTPeriodicEffectDefinition case)!" );
+
+
+ // get definition of the first Periodic effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect effectDefinition;
+ TInt effectIndex = 2;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTPeriodicEffectDefinition case)!" );
+ TEST_ASSERT_DESC( (effectDefinition.iDuration == 1000), "Wrong effect definition (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition from corrupted IVT-data
+ effectIndex = 0;
+ err = iHaptics->GetPeriodicEffectDefinition( corruptedFile, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Get effect definition from corrupted data, incorrect error code (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition of the last Periodic effect
+ effectIndex = 3;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrNone), "Get effect definition failed (GetIVTPeriodicEffectDefinition case)!" );
+ TEST_ASSERT_DESC( (effectDefinition.iDuration == 2000), "Wrong effect definition (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition using effect index out of bounds
+ effectIndex = 6;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition using effect index not pointing to Periodic effect
+ effectIndex = 5;
+ err = iHaptics->GetPeriodicEffectDefinition( fileHandle1, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err != KErrNone), "Get effect definition succeeded (GetIVTPeriodicEffectDefinition case)!" );
+
+ // get definition using unknown file handle
+ effectIndex = 0;
+ err = iHaptics->GetPeriodicEffectDefinition( unknownFileHandle, effectIndex, effectDefinition );
+ TEST_ASSERT_DESC( (err == KErrBadHandle), "Incorrect error code (GetIVTPeriodicEffectDefinition case)!" );
+
+
+ // clean up.. (Teardown() will handle the rest)
+ err = iHaptics->DeleteAllEffectData();
+ TEST_ASSERT_DESC( (err == KErrNone), "Delete All IVT data failed! (GetIVTPeriodicEffectDefinition case))" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Open asynchronously and close haptics client-server session, i.e.
+// create and delete haptics client.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_CreateAndDeleteAsynchronousL()
+ {
+ // create iHaptics instance without observers
+ TRequestStatus status;
+ iHaptics = CHWRMHaptics::NewL( NULL, NULL, status );
+ User::WaitForRequest( status );
+
+ // the connection has been opened successfully, if iHaptics is valid and
+ // error code is not returned
+ TEST_ASSERT_DESC( status == KErrNone, "Haptics client creation failed!");
+ TEST_ASSERT_DESC( iHaptics, "Haptics client creation failed!");
+
+ // the connection is closed, when iHaptics is deleted
+ delete iHaptics;
+ iHaptics = NULL;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Create several simultaneous sessions to haptics server
+// asynchronously.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_SeveralSessionsAsynchronousL()
+ {
+ // create haptics instances without observers. This creates
+ // client-server sessions (session instances in the server)
+ TRequestStatus status1;
+ TRequestStatus status2;
+ TRequestStatus status3;
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL, status1 );
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL, status2 );
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( NULL, NULL, status3 );
+ User::WaitForRequest( status1 );
+ User::WaitForRequest( status2 );
+ User::WaitForRequest( status3 );
+
+ // the connection has been opened successfully, if instances are valid and
+ // error code is not returned
+ TEST_ASSERT_DESC( status1 == KErrNone, "First haptics client creation failed!");
+ TEST_ASSERT_DESC( status2 == KErrNone, "Second haptics client creation failed!");
+ TEST_ASSERT_DESC( status3 == KErrNone, "Third haptics client creation failed!");
+ TEST_ASSERT_DESC( haptics1, "First haptics client creation failed!");
+ TEST_ASSERT_DESC( haptics2, "Second haptics client creation failed!");
+ TEST_ASSERT_DESC( haptics3, "Third haptics client creation failed!");
+
+ // delete haptics instances. This removes the sessions from
+ // haptics server, and closes the server, when the last session
+ // is closed
+ delete haptics1; haptics1 = NULL;
+ delete haptics2; haptics2 = NULL;
+ delete haptics3; haptics3 = NULL;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Create several consecutive sessions asynchronously
+// to haptics server.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ConsecutiveSessionsAsynchronousL()
+ {
+ // Do create and delete three times in a row
+ T_CreateAndDeleteAsynchronousL();
+ T_CreateAndDeleteAsynchronousL();
+ T_CreateAndDeleteAsynchronousL();
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Attemps to pause an effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PauseEffect()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // pause effect testing
+ TInt err = iHaptics->PausePlayingEffect( 0 );
+ TEST_ASSERT_DESC( err == KErrNone, "Pausing an effect with handle 0 failed!");
+ err = iHaptics->PausePlayingEffect( INT_MIN );
+ TEST_ASSERT_DESC( err == KErrNone, "Pausing an effect with handle INT_MIN failed!");
+ err = iHaptics->PausePlayingEffect( INT_MAX );
+ TEST_ASSERT_DESC( err == KErrNone, "Pausing an effect with handle INT_MAX failed!");
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Attemps to resume an effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ResumeEffect()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // resume effect testing
+ TInt err = iHaptics->ResumePausedEffect( 0 );
+ TEST_ASSERT_DESC( err == KErrNone, "Resuming an effect with handle 0 failed!");
+ err = iHaptics->ResumePausedEffect( INT_MIN );
+ TEST_ASSERT_DESC( err == KErrNone, "Resuming an effect with handle INT_MIN failed!");
+ err = iHaptics->ResumePausedEffect( INT_MAX );
+ TEST_ASSERT_DESC( err == KErrNone, "Resuming an effect with handle INT_MAX failed!");
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Attemps to stop an effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_StopEffect()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // stop effect testing
+ TInt err = iHaptics->StopPlayingEffect( 0 );
+ TEST_ASSERT_DESC( err == KErrNone, "Stopping an effect with handle 0 failed!");
+ err = iHaptics->StopPlayingEffect( INT_MIN );
+ TEST_ASSERT_DESC( err == KErrNone, "Stopping an effect with handle INT_MIN failed!");
+ err = iHaptics->StopPlayingEffect( INT_MAX );
+ TEST_ASSERT_DESC( err == KErrNone, "Stopping an effect with handle INT_MAX failed!");
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Attemps to stop all effects.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_StopAllEffects()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // resume effect testing
+ TInt err = iHaptics->StopAllPlayingEffects();
+ TEST_ASSERT_DESC( err == KErrNone, "Stopping all effects failed!");
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Executes sequence: play effect, pause, resume, stop.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayPauseResumeStop()
+ {
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ // read magsweep effect to buffer
+ RBuf8 effBuf;
+ CleanupClosePushL( effBuf );
+ CreateIVTEffect( effBuf, CHWRMHaptics::EHWRMHapticsTypeMagSweep );
+
+ // play the effect
+ TInt effectHandle = 0;
+ TInt err = iHaptics->PlayEffect( effBuf, 0, effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Playing IVT effect synchronously failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Playing IVT effect synchronously returned empty effect handle!" );
+
+ // cleanup buffer
+ CleanupStack::PopAndDestroy( &effBuf );
+
+ // pause the effect
+ err = iHaptics->PausePlayingEffect( effectHandle );
+ TEST_ASSERT_DESC( err == KErrNone, "Pausing the effect failed!");
+
+ // resume the effect
+ err = iHaptics->ResumePausedEffect( effectHandle );
+ TEST_ASSERT_DESC( err == KErrNone, "Resuming the effect failed!");
+
+ // stop the effect
+ err = iHaptics->StopPlayingEffect( effectHandle );
+ TEST_ASSERT_DESC( err == KErrNone, "Stopping the effect failed!");
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Constant getters testing.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ConstantGetters()
+ {
+ const TInt expectedInfRepeat = 255; // VIBE_REPEAT_COUNT_INFINITE
+ const TInt expectedInfDuration = INT_MAX; // VIBE_TIME_INFINITE;
+ const TInt expectedMaxEffNameLen = 128; // VIBE_MAX_EFFECT_NAME_LENGTH
+ const TInt expectedMaxDevNameLen = 64; // VIBE_MAX_DEVICE_NAME_LENGTH
+ const TInt expectedMaxCapaStrLen = 64; // VIBE_MAX_CAPABILITY_STRING_LENGTH
+ const TInt expectedMaxPropStrLen = 64; // VIBE_MAX_PROPERTY_STRING_LENGTH
+ const TInt expectedMaxStrmSampleLen = 255; // VIBE_MAX_STREAMING_SAMPLE_SIZE
+ const TInt expectedDefaultDevPriority = 0; // VIBE_DEVPRIORITY_DEFAULT
+
+ TInt infRepeat = iHaptics->InfiniteRepeat();
+ TEST_ASSERT_DESC( KErrNotReady == infRepeat, "InfiniteRepeat() wrong error code" );
+ TInt infDuration = iHaptics->InfiniteDuration();
+ TEST_ASSERT_DESC( KErrNotReady == infDuration, "InfiniteDuration() wrong error code" );
+ TInt maxEffNameLen = iHaptics->MaxEffectNameLength();
+ TEST_ASSERT_DESC( KErrNotReady == maxEffNameLen, "MaxEffectNameLength() wrong error code" );
+ TInt maxDevNameLen = iHaptics->MaxDeviceNameLength();
+ TEST_ASSERT_DESC( KErrNotReady == maxDevNameLen, "MaxDeviceNameLength() wrong error code" );
+ TInt maxCapaStrLen = iHaptics->MaxCapabilityStringLength();
+ TEST_ASSERT_DESC( KErrNotReady == maxCapaStrLen, "MaxCapabilityStringLength() wrong error code" );
+ TInt maxPropStrLen = iHaptics->MaxPropertyStringLength();
+ TEST_ASSERT_DESC( KErrNotReady == maxPropStrLen, "MaxPropertyStringLength() wrong error code" );
+ TInt maxStrmSampleLen = iHaptics->MaxStreamingSampleSize();
+ TEST_ASSERT_DESC( KErrNotReady == maxStrmSampleLen, "MaxStreamingSampleSize() wrong error code" );
+ TInt defaultDevPriority = iHaptics->DefaultDevicePriority();
+ TEST_ASSERT_DESC( KErrNotReady == defaultDevPriority, "DefaultDevicePriority() wrong error code" );
+
+ // open a supported actuator
+ T_OpenSupportedActuator();
+
+ infRepeat = iHaptics->InfiniteRepeat();
+ TEST_ASSERT_DESC( expectedInfRepeat == infRepeat, "InfiniteRepeat() failed" );
+ infDuration = iHaptics->InfiniteDuration();
+ TEST_ASSERT_DESC( expectedInfDuration == infDuration, "InfiniteDuration() failed" );
+ maxEffNameLen = iHaptics->MaxEffectNameLength();
+ TEST_ASSERT_DESC( expectedMaxEffNameLen == maxEffNameLen, "MaxEffectNameLength() failed" );
+ maxDevNameLen = iHaptics->MaxDeviceNameLength();
+ TEST_ASSERT_DESC( expectedMaxDevNameLen == maxDevNameLen, "MaxDeviceNameLength() failed" );
+ maxCapaStrLen = iHaptics->MaxCapabilityStringLength();
+ TEST_ASSERT_DESC( expectedMaxCapaStrLen == maxCapaStrLen, "MaxCapabilityStringLength() failed" );
+ maxPropStrLen = iHaptics->MaxPropertyStringLength();
+ TEST_ASSERT_DESC( expectedMaxPropStrLen == maxPropStrLen, "MaxPropertyStringLength() failed" );
+ maxStrmSampleLen = iHaptics->MaxStreamingSampleSize();
+ TEST_ASSERT_DESC( expectedMaxStrmSampleLen == maxStrmSampleLen, "MaxStreamingSampleSize() failed" );
+ defaultDevPriority = iHaptics->DefaultDevicePriority();
+ TEST_ASSERT_DESC( expectedDefaultDevPriority == defaultDevPriority, "DefaultDevicePriority() failed" );
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing magsweep effect using synchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ModifyMagSweepEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect modifiedEffect;
+ modifiedEffect.iDuration = 3030;
+ modifiedEffect.iMagnitude = 7070;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TInt err = iHaptics->ModifyPlayingMagSweepEffect( 0, modifiedEffect );
+ TEST_ASSERT_DESC( (err == KErrNone), "Modifying magsweep effect with handle 0 failed!" );
+
+ err = iHaptics->ModifyPlayingMagSweepEffect( INT_MIN, modifiedEffect );
+ TEST_ASSERT_DESC( (err == KErrNone), "Modifying magsweep effect with handle INT_MIN failed!" );
+
+ err = iHaptics->ModifyPlayingMagSweepEffect( INT_MAX, modifiedEffect );
+ TEST_ASSERT_DESC( (err == KErrNone), "Modifying magsweep effect with handle INT_MAX failed!" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing magsweep effect using asynchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ModifyMagSweepEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsMagSweepEffect modifiedEffect;
+ modifiedEffect.iDuration = 5050;
+ modifiedEffect.iMagnitude = 1010;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TRequestStatus status = KRequestPending;
+ iHaptics->ModifyPlayingMagSweepEffect( 0, modifiedEffect, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Modifying magsweep effect with handle 0 failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingMagSweepEffect( INT_MIN, modifiedEffect, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Modifying magsweep effect with handle INT_MIN failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingMagSweepEffect( INT_MAX, modifiedEffect, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Modifying magsweep effect with handle INT_MAX failed!" );
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing periodic effect using synchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ModifyPeriodicEffectSynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect modifiedEffect;
+ modifiedEffect.iDuration = 6060;
+ modifiedEffect.iMagnitude = 2020;
+ modifiedEffect.iPeriod = 200;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TInt err = iHaptics->ModifyPlayingPeriodicEffect( 0, modifiedEffect );
+ TEST_ASSERT_DESC( (err == KErrNone), "Modifying periodic effect with handle 0 failed!" );
+
+ err = iHaptics->ModifyPlayingPeriodicEffect( INT_MIN, modifiedEffect );
+ TEST_ASSERT_DESC( (err == KErrNone), "Modifying periodic effect with handle INT_MIN failed!" );
+
+ err = iHaptics->ModifyPlayingPeriodicEffect( INT_MAX, modifiedEffect );
+ TEST_ASSERT_DESC( (err == KErrNone), "Modifying periodic effect with handle INT_MAX failed!" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Modifies playing periodic effect using asynchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ModifyPeriodicEffectAsynchronous()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // modify effect
+ CHWRMHaptics::THWRMHapticsPeriodicEffect modifiedEffect;
+ modifiedEffect.iDuration = 4040;
+ modifiedEffect.iMagnitude = 6060;
+ modifiedEffect.iPeriod = 200;
+ modifiedEffect.iStyle = CHWRMHaptics::EHWRMHapticsStyleStrong;
+ modifiedEffect.iAttackTime = 2000;
+ modifiedEffect.iAttackLevel = 500;
+ modifiedEffect.iFadeTime = 100;
+ modifiedEffect.iFadeLevel = 10;
+
+ TRequestStatus status = KRequestPending;
+ iHaptics->ModifyPlayingPeriodicEffect( 0, modifiedEffect, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Modifying periodic effect with handle 0 failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingPeriodicEffect( INT_MIN, modifiedEffect, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Modifying periodic effect with handle INT_MIN failed!" );
+
+ status = KRequestPending;
+ iHaptics->ModifyPlayingPeriodicEffect( INT_MAX, modifiedEffect, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone), "Modifying periodic effect with handle INT_MAX failed!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Gets device TInt property
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetDeviceProperty_TInt_TInt()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get the same value 1
+ TInt retValue (0);
+ TInt err = iHaptics->GetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, retValue );
+ TEST_ASSERT_DESC( (err == KErrNone), "Getting device property (Strength) failed(1)!" );
+
+ err = iHaptics->GetDeviceProperty( CHWRMHaptics::EHWRMHapticsDisableEffects, retValue );
+ TEST_ASSERT_DESC( (err == KErrNone), "Getting device property (disableEffects) failed(1)!" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Gets device TDesC property
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetDeviceProperty_TInt_TDesC()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get property
+ TBuf8<100> retValue;
+ TInt err = iHaptics->GetDeviceProperty( CHWRMHaptics::EHWRMHapticsLicensekey, retValue );
+ TEST_ASSERT_DESC( (err == KErrNone), "Setting device property (EHWRMHapticsLicensekey) failed!" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Sets device TInt property
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_SetDeviceProperty_TInt_TInt()
+ {
+ const TInt KSomeValue = 50;
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // set property
+ TInt err = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsStrength, KSomeValue );
+ TEST_ASSERT_DESC( (err == KErrNone), "Setting device property (Strength) failed!" );
+
+ err = iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsDisableEffects, 0 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Setting device property (disableEffects) failed!" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Sets device TDesC property
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_SetDeviceProperty_TInt_TDesC()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // set property
+ TInt err = iHaptics->SetDeviceProperty(
+ CHWRMHaptics::EHWRMHapticsLicensekey,
+ KNullDesC8 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Setting device property (NULL license key) failed!" );
+
+ err = iHaptics->SetDeviceProperty(
+ CHWRMHaptics::EHWRMHapticsLicensekey,
+ KPlainKey );
+ TEST_ASSERT_DESC( (err == KErrNone), "Setting device property (license key) failed!" );
+ return err;
+ }
+
+TInt CHapticsClientTest::T_PluginMgrTransTimerExpires()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ _LIT8 ( KTestPluginMgrTransTimerExpires, "KTestPluginMgrTransTimerExpires" );
+ // set property with the TestCase ID string, so that the test plug-in doesn't send the response for the current
+ // transaction, till the Plug-in manager Transction timer expires.
+ // Out-come: Plug-in manager should hanlde this scenario and send cancel transaction command to test plug-in.
+ TInt err = iHaptics->SetDeviceProperty(
+ CHWRMHaptics::EHWRMHapticsLicensekey,
+ KTestPluginMgrTransTimerExpires );
+ TEST_ASSERT_DESC( (err == KErrTimedOut), "Setting device property (license key) failed!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Gets device TInt capability
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetDeviceCapability_TInt_TInt()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get the value
+ TInt retValue (0);
+ TInt expectedValue (1); // from testplugin's stubresponse.txt
+ TInt err = iHaptics->GetDeviceCapability( CHWRMHaptics::EHWRMHapticsMaxNestedRepeats, retValue );
+ TEST_ASSERT_DESC( (err == KErrNone),
+ "Getting device property (MaxNestedRepeats) failed!" );
+ TEST_ASSERT_DESC( expectedValue == retValue,
+ "Getting device property (MaxNestedRepeats) failed, wrong value!")
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Gets device TDesC capability
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetDeviceCapability_TInt_TDesC()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // get the same value
+ TBuf8<100> retValue;
+ retValue.FillZ(); // sets length, important here..
+ TInt err = iHaptics->GetDeviceCapability( CHWRMHaptics::EHWRMHapticsDeviceName, retValue );
+ TEST_ASSERT_DESC( (err == KErrNone), "Getting device property (DevName) failed!" );
+ // the following are based on what the testplugin retunrs (i.e., bytes
+ // containing the ASCII character values for "S","T","U" and "B")
+ const TInt expectedSize( 4 );
+ TEST_ASSERT_DESC( expectedSize == retValue.Size(),
+ "Getting device property (DevName) failed, wrong length!" );
+ const TUint8 ascii4S( 0x53 );
+ const TUint8 ascii4T( 0x54 );
+ const TUint8 ascii4U( 0x55 );
+ const TUint8 ascii4B( 0x42 );
+ TEST_ASSERT_DESC( ascii4S == retValue[0] && ascii4T == retValue[1] &&
+ ascii4U == retValue[2] && ascii4B == retValue[3],
+ "Getting device property (DevName) failed, wrong data!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Fetches the haptics status using the getter method.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetHapticsStatus()
+ {
+ MHWRMHapticsObserver::THWRMHapticsStatus status = iHaptics->HapticsStatus();
+ TEST_ASSERT_DESC( (status == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable),
+ "Invalid haptics status received!" );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Fetches the haptics status using the observer.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ObserveHapticsStatus()
+ {
+ // create callback instance
+ THapticsStatusCallback callback( this );
+
+ // create haptics client with observer
+ CHWRMHaptics* haptics = CHWRMHaptics::NewL( &callback, NULL );
+
+ // wait for the callback to be called
+ iWait.Start();
+
+ // check status (since execution of this method continues, the status
+ // has been updated in the callback)
+ TEST_ASSERT_DESC( (callback.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ delete haptics;
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Fetches status values, when one client is reserving
+// haptics.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetHapticsStatusWithReservations()
+ {
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // make reservation using the first client
+ haptics1->ReserveHapticsL();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = haptics1->HapticsStatus();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = haptics2->HapticsStatus();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation
+ haptics1->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Status value observing, when one client is reserving
+// haptics.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ObserveHapticsStatusWithReservations()
+ {
+ // create callback instances
+ THapticsStatusCallback callback1( this );
+ THapticsStatusCallback callback2( this );
+
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &callback1, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &callback2, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // wait for the initial notifications to arrive
+ iWait.Start();
+ iWait.Start();
+
+ // make reservation using the first client
+ haptics1->ReserveHapticsL();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = callback2.Status();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation
+ haptics1->ReleaseHaptics();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ status2 = callback2.Status();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Haptics status, when several clients are making
+// reservations with equal priorities.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetHapticsStatusWithSeveralReservations()
+ {
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // make reservation using both clients (second should become suspended)
+ haptics1->ReserveHapticsL();
+ haptics2->ReserveHapticsL();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = haptics1->HapticsStatus();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = haptics2->HapticsStatus();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusSuspended ),
+ "Invalid haptics status received!" );
+
+ // release reservation of the first client
+ haptics1->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // release reservation of the second client
+ haptics2->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Haptics status using observation, when several clients
+// are making reservations with equal priorities.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ObserveHapticsStatusWithSeveralReservations()
+ {
+ // create callback instances
+ THapticsStatusCallback callback1( this );
+ THapticsStatusCallback callback2( this );
+
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &callback1, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &callback2, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ // wait for the initial notifications to arrive
+ iWait.Start();
+ iWait.Start();
+
+ // make reservation using the first client
+ haptics1->ReserveHapticsL();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = callback2.Status();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // make reservation using the second client
+ haptics2->ReserveHapticsL();
+
+ // wait for the callback to be called (only second client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ status2 = callback2.Status();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusSuspended ),
+ "Invalid haptics status received!" );
+
+ // release first client's reservation
+ haptics1->ReleaseHaptics();
+
+ // wait for the callback to be called (both clients should
+ // receive new status)
+ iWait.Start();
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = callback1.Status();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ status2 = callback2.Status();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // release second client's reservation
+ haptics2->ReleaseHaptics();
+
+ // wait for the callback to be called (only first client
+ // should receive notification)
+ iWait.Start();
+
+ // check client status values
+ status1 = callback1.Status();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Several clients with one making a reservation --> tests
+// that all other clients become "reserved".
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_GetHapticsStatusWithSeveralClientsOneReservation()
+ {
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics3 );
+
+ // reservation using first client
+ haptics1->ReserveHapticsL();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status1 = haptics1->HapticsStatus();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = haptics2->HapticsStatus();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status3 = haptics3->HapticsStatus();
+ TEST_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation
+ haptics1->ReleaseHaptics();
+
+ // check client status values
+ status1 = haptics1->HapticsStatus();
+ TEST_ASSERT_DESC( ( status1 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status2 = haptics2->HapticsStatus();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status3 = haptics3->HapticsStatus();
+ TEST_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics3 );
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Several clients with one making a reservation --> tests
+// that all other clients become "reserved" using observers.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ObserveHapticsStatusWithSeveralClientsOneReservations()
+ {
+ // create callback instances
+ THapticsStatusCallback callback1( this );
+ THapticsStatusCallback callback2( this );
+ THapticsStatusCallback callback3( this );
+
+ // create haptics instances
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &callback1, NULL );
+ CleanupStack::PushL( haptics1 );
+
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &callback2, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( &callback3, NULL );
+ CleanupStack::PushL( haptics3 );
+
+ // wait for the initial notifications to arrive
+ iWait.Start();
+ iWait.Start();
+ iWait.Start();
+
+ // reservation using first client
+ haptics1->ReserveHapticsL();
+
+ // wait for the notifications for client2 and client3
+ iWait.Start();
+ iWait.Start();
+
+ // check client status values
+ MHWRMHapticsObserver::THWRMHapticsStatus status2 = callback2.Status();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ MHWRMHapticsObserver::THWRMHapticsStatus status3 = callback3.Status();
+ TEST_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+
+ // release reservation using first client
+ haptics1->ReleaseHaptics();
+
+ // wait for the notifications for client2 and client3
+ iWait.Start();
+ iWait.Start();
+
+ // check client status values
+ status2 = callback2.Status();
+ TEST_ASSERT_DESC( ( status2 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ status3 = callback3.Status();
+ TEST_ASSERT_DESC( ( status3 == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics3 );
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Creates streaming effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_CreateStreamingEffect()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ TInt effectHandle;
+ TInt err = iHaptics->CreateStreamingEffect( effectHandle );
+ TEST_ASSERT_DESC( (err == KErrNone), "Creating streaming effect failed!" );
+ TEST_ASSERT_DESC( effectHandle, "Creating streaming effect returned empty effect handle!" );
+ return err;
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample using synchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayStreamingSample()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // valid sized sample 0 handle 0 offset
+ TInt err = iHaptics->PlayStreamingSample( 0, validStreamSample );
+ TEST_ASSERT_DESC( (err == KErrNone), "Play streaming sample failed!" );
+
+ // normal sample MIN handle MIN offset
+ err = iHaptics->PlayStreamingSample( INT_MIN, validStreamSample );
+ TEST_ASSERT_DESC( (err == KErrNone), "Play streaming sample failed!" );
+
+ // normal sample MAX handle MAX offset
+ err = iHaptics->PlayStreamingSample( INT_MAX, validStreamSample );
+ TEST_ASSERT_DESC( (err == KErrNone), "Play streaming sample failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ err = iHaptics->PlayStreamingSample( INT_MAX, tooBigStreamSample );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Play streaming sample (over sized sample), wrong error code" );
+
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ err = iHaptics->PlayStreamingSample( INT_MIN, validStreamSample );
+ TEST_ASSERT_DESC( ( err == KErrInUse ), "Play streaming sample (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample using asynchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayStreamingSampleAsync()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // normal sample 0 handle 0 offset
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayStreamingSample( 0, validStreamSample, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample failed!" );
+
+ // normal sample MIN handle MIN offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MIN, validStreamSample, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample failed!" );
+
+ // normal sample MAX handle MAX offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MAX, validStreamSample, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MAX, tooBigStreamSample, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrArgument ), "Play streaming sample (over sized sample), wrong error code" );
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MIN, validStreamSample, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse ), "Play streaming sample (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample with offset using
+// synchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayStreamingSampleWithOffset()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // valid sized sample 0 handle 0 offset
+ TInt err = iHaptics->PlayStreamingSampleWithOffset( 0, validStreamSample, 0 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Play streaming sample with offset failed!" );
+
+ // normal sample MIN handle MIN offset
+ err = iHaptics->PlayStreamingSampleWithOffset( INT_MIN, validStreamSample, INT_MIN );
+ TEST_ASSERT_DESC( (err == KErrNone), "Play streaming sample with offset failed!" );
+
+ // normal sample MAX handle MAX offset
+ err = iHaptics->PlayStreamingSampleWithOffset( INT_MAX, validStreamSample, INT_MAX );
+ TEST_ASSERT_DESC( (err == KErrNone), "Play streaming sample with offset failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ err = iHaptics->PlayStreamingSampleWithOffset( INT_MAX, tooBigStreamSample, INT_MAX );
+ TEST_ASSERT_DESC( (err == KErrArgument), "Play streaming sample with offset (over sized sample), wrong error code" );
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ err = iHaptics->PlayStreamingSample( INT_MIN, validStreamSample );
+ TEST_ASSERT_DESC( ( err == KErrInUse ), "Play streaming sample (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Plays streaming sample with offset using
+// asynchronous API call.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_PlayStreamingSampleWithOffsetAsync()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+ RBuf8 validStreamSample;
+ RBuf8 tooBigStreamSample;
+ CleanupClosePushL( validStreamSample );
+ CleanupClosePushL( tooBigStreamSample );
+
+ TInt maxValidSize = iHaptics->MaxStreamingSampleSize();
+ CreateDummyStreamSample( maxValidSize, validStreamSample );
+
+ // normal sample 0 handle 0 offset
+ TRequestStatus status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( 0, validStreamSample, 0, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample with offset failed!" );
+
+ // normal sample MIN handle MIN offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( INT_MIN, validStreamSample, INT_MIN, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample with offset failed!" );
+
+ // normal sample MAX handle MAX offset
+ status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( INT_MAX, validStreamSample, INT_MAX, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrNone ), "Play streaming sample with offset failed!" );
+
+ // over sized sample
+ CreateDummyStreamSample( maxValidSize+1, tooBigStreamSample );
+ status = KRequestPending;
+ iHaptics->PlayStreamingSampleWithOffset( INT_MAX, tooBigStreamSample, INT_MAX, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrArgument ), "Play streaming sample with offset (over sized sample), wrong error code" );
+
+ // Haptics reserved for higher priority client
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, NULL );
+ CleanupStack::PushL( haptics2 );
+
+ TRAPD( error, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+
+ // set new client priority to maximum
+ haptics2->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMaxDevicePriority );
+ // set default client priority to min
+ iHaptics->SetDeviceProperty( CHWRMHaptics::EHWRMHapticsPriority,
+ KHWRMHapticsMinDevicePriority );
+ TRAP( error, haptics2->ReserveHapticsL() );
+
+ status = KRequestPending;
+ iHaptics->PlayStreamingSample( INT_MIN, validStreamSample, status );
+ User::WaitForRequest( status );
+ TEST_ASSERT_DESC( (status.Int() == KErrInUse ), "Play streaming sample with offset (haptics reserved), wrong error code" );
+
+
+
+ // clean up.. (Teardown will complete these)
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy(); //tooBigStreamSample
+ CleanupStack::PopAndDestroy(); //validStreamSample
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------
+// Destroys streaming effect.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_DestroyStreamingEffect()
+ {
+ // open actuator..
+ T_OpenSupportedActuator();
+
+ // zero handle
+ TInt err = iHaptics->DestroyStreamingEffect( 0 );
+ TEST_ASSERT_DESC( (err == KErrNone), "Destroying streaming effect with handle 0 failed!" );
+
+ // minimum handle value
+ err = iHaptics->DestroyStreamingEffect( INT_MIN );
+ TEST_ASSERT_DESC( (err == KErrNone), "Destroying streaming effect with handle INT_MIN failed!" );
+
+ // maximum handle value
+ err = iHaptics->DestroyStreamingEffect( INT_MAX );
+ TEST_ASSERT_DESC( (err == KErrNone), "Destroying streaming effect with handle INT_MAX failed!" );
+ return err;
+ }
+
+
+// ---------------------------------------------------------
+// Fetches actuator state using the observer.
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ObserveActuatorStatus()
+ {
+ // Create 2 actuator status observer instances
+ TActuatorStatusCallback callback1( this );
+ TActuatorStatusCallback callback2( this );
+
+ // create 1st haptics client with actuator observer
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( NULL, &callback1 );
+ CleanupStack::PushL( haptics1 );
+
+ //Open actuator
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ // wait for the callback to be called
+ iWait.Start();
+
+ // check actuator state (since execution of this method continues, the state
+ // has been updated in the callback)
+ TEST_ASSERT_DESC( (callback1.Status(EHWRMLogicalActuatorAny) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator state received!" );
+
+ // create 2nd haptics client with actuator observer
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( NULL, &callback2 );
+ CleanupStack::PushL( haptics2 );
+
+ //Open actuator
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+
+ // wait for the callback to be called
+ iWait.Start();
+
+ // check actuator state (since execution of this method continues, the state
+ // has been updated in the callback)
+ TEST_ASSERT_DESC( (callback2.Status(EHWRMLogicalActuatorDevice) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator state received!" );
+
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+TInt CHapticsClientTest::T_ObserveActuatorStatusAndHapticsStatus()
+ {
+ // Create 3 actuator status observers.
+ TActuatorStatusCallback actuatorCallback1( this );
+ TActuatorStatusCallback actuatorCallback2( this );
+ TActuatorStatusCallback actuatorCallback3( this );
+
+ // Create 3 haptics status observers.
+ THapticsStatusCallback hapticsCallback1( this );
+ THapticsStatusCallback hapticsCallback2( this );
+ THapticsStatusCallback hapticsCallback3( this );
+
+ // create 1st haptics client with observers
+ CHWRMHaptics* haptics1 = CHWRMHaptics::NewL( &hapticsCallback1, &actuatorCallback1 );
+ CleanupStack::PushL( haptics1 );
+
+ //Open actuator
+ TRAPD( err, haptics1->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ // wait for the actuator status callback to be called
+ iWait.Start();
+
+ // check actuator status (since execution of this method continues, the status
+ // has been updated in the callback)
+ TEST_ASSERT_DESC( (actuatorCallback1.Status(EHWRMLogicalActuatorDevice) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator status received!" );
+ // check haptics status
+ TEST_ASSERT_DESC( ( hapticsCallback1.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ haptics1->ReserveHapticsL();
+
+
+ // create 2nd and 3rd haptics clients with observers
+ CHWRMHaptics* haptics2 = CHWRMHaptics::NewL( &hapticsCallback2, &actuatorCallback2 );
+ CleanupStack::PushL( haptics2 );
+ CHWRMHaptics* haptics3 = CHWRMHaptics::NewL( &hapticsCallback3, &actuatorCallback3 );
+ CleanupStack::PushL( haptics3 );
+
+ // reserve haptics for 2nd client
+ haptics2->ReserveHapticsL();
+
+ //Open actuator
+ TRAP( err, haptics2->OpenActuatorL( EHWRMLogicalActuatorAny ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Any failed!" );
+
+ TRAP( err, haptics3->OpenActuatorL( EHWRMLogicalActuatorDevice ) );
+ TEST_ASSERT_DESC( (err == KErrNone), "Opening actuator with type Device failed!" );
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ iWait.Start();
+ iWait.Start();
+ // wait for the actuator status callback to be called
+ iWait.Start();
+ iWait.Start();
+
+ // check haptics status (since execution of this method continues, the status
+ // has been updated in the callback)
+ TEST_ASSERT_DESC( ( hapticsCallback2.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusSuspended ),
+ "Invalid haptics status received!" );
+ TEST_ASSERT_DESC( ( hapticsCallback3.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ // check actuator status
+ TEST_ASSERT_DESC( (actuatorCallback2.Status(EHWRMLogicalActuatorAny) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator status received!" );
+ TEST_ASSERT_DESC( (actuatorCallback3.Status(EHWRMLogicalActuatorDevice) == MHWRMHapticsActuatorObserver::EHWRMActuatorEnabled),
+ "Invalid actuator status received!" );
+
+ // release haptics
+ haptics1->ReleaseHaptics();
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ iWait.Start();
+
+ TEST_ASSERT_DESC( ( hapticsCallback1.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusReserved ),
+ "Invalid haptics status received!" );
+ TEST_ASSERT_DESC( ( hapticsCallback2.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+
+ // release haptics
+ haptics2->ReleaseHaptics();
+
+ // wait for the haptics status callback to be called
+ iWait.Start();
+ iWait.Start();
+
+ TEST_ASSERT_DESC( ( hapticsCallback1.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+ TEST_ASSERT_DESC( ( hapticsCallback3.Status() == MHWRMHapticsObserver::EHWRMHapticsStatusAvailable ),
+ "Invalid haptics status received!" );
+
+ // cleanup
+ CleanupStack::PopAndDestroy( haptics3 );
+ CleanupStack::PopAndDestroy( haptics2 );
+ CleanupStack::PopAndDestroy( haptics1 );
+ return KErrNone;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/haptics_stif/src/hapticsclienttest_main.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,161 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: ?Description
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <Stiftestinterface.h>
+#include "hapticsclienttest.h"
+
+
+// EXTERNAL DATA STRUCTURES
+//extern ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define ?macro ?macro_def
+
+// LOCAL CONSTANTS AND MACROS
+//const ?type ?constant_var = ?constant;
+//#define ?macro_name ?macro_def
+
+// MODULE DATA STRUCTURES
+//enum ?declaration
+//typedef ?declaration
+
+// LOCAL FUNCTION PROTOTYPES
+//?type ?function_name( ?arg_type, ?arg_type );
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ?function_name ?description.
+// ?description
+// Returns: ?value_1: ?description
+// ?value_n: ?description_line1
+// ?description_line2
+// -----------------------------------------------------------------------------
+//
+/*
+?type ?function_name(
+ ?arg_type arg, // ?description
+ ?arg_type arg) // ?description
+ {
+
+ ?code // ?comment
+
+ // ?comment
+ ?code
+ }
+*/
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CHapticsClientTest::CHapticsClientTest
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CHapticsClientTest::CHapticsClientTest(
+ CTestModuleIf& aTestModuleIf ):
+ CScriptBase( aTestModuleIf )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CHapticsClientTest::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHapticsClientTest::ConstructL()
+ {
+ iLog = CStifLogger::NewL( KHapticsClientTestLogPath,
+ KHapticsClientTestLogFile,
+ CStifLogger::ETxt,
+ CStifLogger::EFile,
+ EFalse );
+ BuildL ();
+ }
+
+// -----------------------------------------------------------------------------
+// CHapticsClientTest::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CHapticsClientTest* CHapticsClientTest::NewL(
+ CTestModuleIf& aTestModuleIf )
+ {
+ CHapticsClientTest* self = new (ELeave) CHapticsClientTest( aTestModuleIf );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+
+ }
+
+// Destructor
+CHapticsClientTest::~CHapticsClientTest()
+ {
+
+ // Delete resources allocated from test methods
+ Delete();
+
+ // Delete logger
+ delete iLog;
+
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// -----------------------------------------------------------------------------
+// LibEntryL is a polymorphic Dll entry point.
+// Returns: CScriptBase: New CScriptBase derived object
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CHapticsClientTest* LibEntryL(
+ CTestModuleIf& aTestModuleIf ) // Backpointer to STIF Test Framework
+ {
+ CHapticsClientTest* libEntry ( CHapticsClientTest::NewL( aTestModuleIf ) );
+ return libEntry;
+ }
+
+// -----------------------------------------------------------------------------
+// E32Dll is a DLL entry point function.
+// Returns: KErrNone
+// -----------------------------------------------------------------------------
+//
+#ifndef EKA2 // Hide Dll entry point to EKA2
+GLDEF_C TInt E32Dll(
+ TDllReason /*aReason*/) // Reason code
+ {
+ return(KErrNone);
+
+ }
+#endif // EKA2
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/data/2001CB6D.rss Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2001 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics (adaptation) test plugins ECom resource file
+*
+*/
+
+
+#include <ecom/RegistryInfoV2.rh>
+
+// Declares info for implementations
+RESOURCE REGISTRY_INFO SA_HAPTICS_ADAPTATION
+ {
+ resource_format_version = RESOURCE_FORMAT_VERSION_2;
+ dll_uid = 0x2001CB6D; //Haptics adaptation DLL
+ interfaces =
+ {
+ INTERFACE_INFO
+ {
+ interface_uid = 0x2001CBE4; //KCHWRMHapticsPluginServiceInterfaceUid
+ implementations =
+ {
+ // Haptics adaptation implementation
+ IMPLEMENTATION_INFO
+ {
+ implementation_uid = 0x2001CB6E; // Haptics Adaptation Plugin Implementation UID
+ version_no = 1;
+ display_name = "Haptics Test plugin";
+ default_data = "EHWRMLogicalActuatorAny||EHWRMLogicalActuatorDevice";
+ opaque_data = "";
+ rom_only = 0;
+ }
+ };
+ }
+ };
+ }
+
+// End of File
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/data/hwrmhapticspolicy.ini Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,4 @@
+// This is product specific policy file for lights.
+// Products need to include this in builds,
+// if required.
+// This empty file is exported by hwrmstubplugins
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/data/stubresponse.txt Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,53 @@
+[VIBEPKT_CMD_OPENDEVICE] "12000002000130"
+[VIBEPKT_CMD_SETDEVICEPROPERTY] "1000000000000003"
+[VIBEPKT_CMD_PLAYMAGSWEEPEFFECT] "1C0000000330F4"
+[VIBEPKT_CMD_CLOSEDEVICE] "130000"
+[VIBEPKT_CMD_DEVICE_COUNT] "150000"
+
+[VIBEPKT_CMD_GETDEVICEPROPERTY_INTEGER] "11000001000000010401000000"
+[VIBEPKT_CMD_GETDEVICEPROPERTY_STRING] "1100000000000003205354554253545542535455425354554253545542535455425354554253545542"
+[VIBEPKT_CMD_GETDEVICEPROPERTY_BOOL] "11000002000000020101"
+
+[VIBEPKT_CMD_GETDEVICESTATE] "0D000010000000"
+
+[VIBEPKT_CMD_GETDEVICECAPABILITIES_INTEGER] "09000001000000010401000000"
+[VIBEPKT_CMD_GETDEVICECAPABILITIES_STRING] "0900000A000000030453545542"
+
+[VIBEPKT_CMD_PLAYPERIODICEFFECT] "1D0000000230D0"
+[VIBEPKT_CMD_PLAYIVTEFFECT_INCLUDEIVTDATA] "04000010000000"
+[VIBEPKT_CMD_PLAYIVTEFFECT_NOIVTDATA] "05000010000000"
+
+[VIBEPKT_CMD_STOPEFFECT] "070000"
+[VIBEPKT_CMD_STOPALLEFFECTS] "080000"
+
+[VIBEPKT_CMD_PLAYSTREAMINGSAMPLE] "160000"
+[VIBEPKT_CMD_CREATESTREAMINGEFFECT] "17000010000000"
+[VIBEPKT_CMD_DESTROYSTREAMINGEFFECT] "180000"
+[VIBEPKT_CMD_MODIFYPLAYINGMAGSWEEPEFFECT] "1E0000"
+[VIBEPKT_CMD_MODIFYPLAYINGPERIODICEFFECT] "1F0000"
+[VIBEPKT_CMD_PAUSEPLAYINGEFFECT] "190000"
+[VIBEPKT_CMD_RESUMEPAUSEDEFFECT] "1A0000"
+
+[VIBEPKT_CMD_GETEFFECTSTATE_NOTPLAYING] "1B000000"
+[VIBEPKT_CMD_GETEFFECTSTATE_PLAYING] "1B000001"
+[VIBEPKT_CMD_GETEFFECTSTATE_PAUSED] "1B000002"
+[VIBEPKT_CMD_SETKERNELPARAMETER] "0E00001001"
+[VIBEPKT_CMD_GETKERNELPARAMETER] "0F00001001BB1C"
+
+[VIBEPKT_CMD_STATUSCASESUCCESS] "05000010000000"
+[VIBEPKT_CMD_STATUSCASEALREADYINIT] "0500FF10000000"
+[VIBEPKT_CMD_STATUSCASENOTINIT] "0500FE10000000"
+[VIBEPKT_CMD_STATUSCASEINVALIDARG] "0500FD10000000"
+[VIBEPKT_CMD_STATUSCASEFAIL] "0500FC10000000"
+[VIBEPKT_CMD_STATUSCASEINCOMPEFFTYPE] "0500FB10000000"
+[VIBEPKT_CMD_STATUSCASEINCOMPCAPATYPE] "0500FA10000000"
+[VIBEPKT_CMD_STATUSCASEINCOMPPROPTYPE] "0500F910000000"
+[VIBEPKT_CMD_STATUSCASEDEVNEEDSLICENSE] "0500F810000000"
+[VIBEPKT_CMD_STATUSCASENOTENOUGHMEM] "0500F710000000"
+[VIBEPKT_CMD_STATUSCASESRVNOTRUNNING] "0500F610000000"
+[VIBEPKT_CMD_STATUSCASEERRINSUFFPRIORITY] "0500F510000000"
+[VIBEPKT_CMD_STATUSCASESRVBUSY] "0500F410000000"
+[VIBEPKT_CMD_STATUSCASEWRNNOTPLAYING] "05000110000000"
+[VIBEPKT_CMD_STATUSCASEWRNINSUFFPRIORITY] "05000210000000"
+
+[VIBEPKT_CMD_SETLICENSE] "1000000000000003"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics adaptation test plugins bld file
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_EXPORTS
+../data/stubresponse.txt /epoc32/winscw/c/system/Apps/Haptics/stubresponse.txt
+../data/stubresponse.txt /epoc32/data/z/system/Apps/Haptics/stubresponse.txt
+../rom/hapticsadaptation.iby /epoc32/rom/include/hapticsadaptation.iby
+
+PRJ_MMPFILES
+../group/hwrmhapticstestplugins.mmp
+
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/group/hwrmhapticstestplugins.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics test (adaptation) plugin project definition file
+*
+*/
+
+
+#include <platform_paths.hrh>
+
+TARGET hapticsadaptation.dll
+TARGETTYPE PLUGIN
+
+UID 0x10009D8D 0x2001CB6D
+
+VENDORID VID_DEFAULT
+
+CAPABILITY CAP_ECOM_PLUGIN
+
+SOURCEPATH ../src
+SOURCE proxy.cpp
+SOURCE hwrmhapticstestplugin.cpp
+SOURCE plugintimer.cpp
+
+START RESOURCE ../data/2001CB6D.rss
+TARGET hapticsadaptation.rsc
+END
+
+USERINCLUDE ../inc
+USERINCLUDE ../../../hapticspacketizer/plugins/hapticsvibepacketizerplugin/inc
+USERINCLUDE ../../../inc
+
+OS_LAYER_SYSTEMINCLUDE
+OS_LAYER_LIBC_SYSTEMINCLUDE
+
+LIBRARY euser.lib
+LIBRARY ecom.lib
+LIBRARY efsrv.lib
+LIBRARY flogger.lib
+LIBRARY estor.lib
+LIBRARY eikcore.lib
+LIBRARY cone.lib
+LIBRARY hwrmhapticspluginservice.lib
+
+LANG SC
+
+// Test macro
+// MACRO ENABLE_NOTIFICATIONS // Uncomment during testing to receive periodic notifications
+MACRO PUBLISH_STATE_INFO // Uncomment before running HWRM module tests to get proper results
+
+SMPSAFE
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/inc/hwrmhapticstestplugin.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,260 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics test (adaptation) plugin header file.
+*
+*/
+
+
+#ifndef __HWRMHAPTICSTESTPLUGIN_H_
+#define __HWRMHAPTICSTESTPLUGIN_H_
+
+#include <f32file.h>
+#include <HWRMHapticsPluginService.h>
+#include <HWRMHapticsCommands.h>
+#include "PluginTimer.h"
+#include "hwrmhapticsvibepackets.h"
+
+#ifdef PUBLISH_STATE_INFO
+#include <e32property.h>
+const TUid KPSUidHWResourceNotification = { 0x101F7A04 }; // HWRM private PS Uid
+const TUint32 KHWRMTestHapticsCommand = 0x11110001;
+const TUint32 KHWRMTestHapticsDataPckg = 0x11110002;
+const TUint32 KHWRMTestVibCmdData = 0x11110003;
+#endif // PUBLISH_STATE_INFO
+
+#ifdef __WINS__
+ _LIT( KStubResponseFile, "C:\\system\\apps\\haptics\\stubresponse.txt" );
+#else
+ _LIT( KStubResponseFile, "Z:\\system\\apps\\haptics\\stubresponse.txt" );
+#endif
+
+_LIT8( KVibraCmdInitialize, "VIBEPKT_CMD_INITIALIZE" );
+_LIT8( KVibraCmdOpenDevice, "VIBEPKT_CMD_OPENDEVICE" );
+_LIT8( KVibraCmdSetDeviceProperty, "VIBEPKT_CMD_SETDEVICEPROPERTY" );
+_LIT8( KVibraCmdPlayMagSweepEffect, "VIBEPKT_CMD_PLAYMAGSWEEPEFFECT" );
+_LIT8( KVibraCmdCloseDevice, "VIBEPKT_CMD_CLOSEDEVICE" );
+_LIT8( KVibraCmdDeviceCount, "VIBEPKT_CMD_DEVICE_COUNT" );
+_LIT8( KVibraCmdGetDeviceProperty, "VIBEPKT_CMD_GETDEVICEPROPERTY" );
+_LIT8( KVibraCmdGetDevicePropertyInteger, "VIBEPKT_CMD_GETDEVICEPROPERTY_INTEGER" );
+_LIT8( KVibraCmdGetDevicePropertyString, "VIBEPKT_CMD_GETDEVICEPROPERTY_STRING" );
+_LIT8( KVibraCmdGetDevicePropertyBool, "VIBEPKT_CMD_GETDEVICEPROPERTY_BOOL" );
+_LIT8( KVibraCmdGetDeviceState, "VIBEPKT_CMD_GETDEVICESTATE" );
+_LIT8( KVibraCmdGetDeviceCapabilities, "VIBEPKT_CMD_GETDEVICECAPABILITIES" );
+_LIT8( KVibraCmdGetDeviceCapabilitiesInteger, "VIBEPKT_CMD_GETDEVICECAPABILITIES_INTEGER" );
+_LIT8( KVibraCmdGetDeviceCapabilitiesString, "VIBEPKT_CMD_GETDEVICECAPABILITIES_STRING" );
+_LIT8( KVibraCmdPlayPeriodicEffect, "VIBEPKT_CMD_PLAYPERIODICEFFECT" );
+_LIT8( KVibraCmdPlayIVTEffectIncludeIVTData, "VIBEPKT_CMD_PLAYIVTEFFECT_INCLUDEIVTDATA" );
+_LIT8( KVibraCmdPlayIVTEffectNoIVTData, "VIBEPKT_CMD_PLAYIVTEFFECT_NOIVTDATA" );
+_LIT8( KVibraCmdStopEffect, "VIBEPKT_CMD_STOPEFFECT" );
+_LIT8( KVibraCmdStopAllEffects, "VIBEPKT_CMD_STOPALLEFFECTS" );
+_LIT8( KVibraCmdPlayStreamingSample, "VIBEPKT_CMD_PLAYSTREAMINGSAMPLE" );
+_LIT8( KVibraCmdCreateStreamingEffect, "VIBEPKT_CMD_CREATESTREAMINGEFFECT" );
+_LIT8( KVibraCmdDestroyStreamingEffect, "VIBEPKT_CMD_DESTROYSTREAMINGEFFECT" );
+_LIT8( KVibraCmdModifyPlayingMagSweepEffect, "VIBEPKT_CMD_MODIFYPLAYINGMAGSWEEPEFFECT" );
+_LIT8( KVibraCmdModifyPlayingPeriodicEffect, "VIBEPKT_CMD_MODIFYPLAYINGPERIODICEFFECT" );
+_LIT8( KVibraCmdPausePlayingEffect, "VIBEPKT_CMD_PAUSEPLAYINGEFFECT" );
+_LIT8( KVibraCmdResumePausedEffect, "VIBEPKT_CMD_RESUMEPAUSEDEFFECT" );
+_LIT8( KVibraCmdGetEffectStateNotPlaying, "VIBEPKT_CMD_GETEFFECTSTATE_NOTPLAYING" );
+_LIT8( KVibraCmdGetEffectStatePlaying, "VIBEPKT_CMD_GETEFFECTSTATE_PLAYING" );
+_LIT8( KVibraCmdGetEffectStatePaused, "VIBEPKT_CMD_GETEFFECTSTATE_PAUSED" );
+_LIT8( KVibraCmdSetKernelParameter, "VIBEPKT_CMD_SETKERNELPARAMETER" );
+_LIT8( KVibraCmdGetKernelParameter, "VIBEPKT_CMD_GETKERNELPARAMETER" );
+_LIT8( KVibraCmdSetLicense, "VIBEPKT_CMD_SETLICENSE" );
+
+// for vibe status to S60 status cases..
+_LIT8(KVibraCmdStatusCaseSuccess, "VIBEPKT_CMD_STATUSCASESUCCESS");
+_LIT8(KVibraCmdStatusCaseAlreadyInit, "VIBEPKT_CMD_STATUSCASEALREADYINIT");
+_LIT8(KVibraCmdStatusCaseNotInit, "VIBEPKT_CMD_STATUSCASENOTINIT");
+_LIT8(KVibraCmdStatusCaseInvalidArg, "VIBEPKT_CMD_STATUSCASEINVALIDARG");
+_LIT8(KVibraCmdStatusCaseFail, "VIBEPKT_CMD_STATUSCASEFAIL");
+_LIT8(KVibraCmdStatusCaseIncompEffType, "VIBEPKT_CMD_STATUSCASEINCOMPEFFTYPE");
+_LIT8(KVibraCmdStatusCaseIncompCapaType, "VIBEPKT_CMD_STATUSCASEINCOMPCAPATYPE");
+_LIT8(KVibraCmdStatusCaseIncompPropType, "VIBEPKT_CMD_STATUSCASEINCOMPPROPTYPE");
+_LIT8(KVibraCmdStatusCaseDevNeedsLicense, "VIBEPKT_CMD_STATUSCASEDEVNEEDSLICENSE");
+_LIT8(KVibraCmdStatusCaseNotEnoughMem, "VIBEPKT_CMD_STATUSCASENOTENOUGHMEM");
+_LIT8(KVibraCmdStatusCaseSrvNotRunning, "VIBEPKT_CMD_STATUSCASESRVNOTRUNNING");
+_LIT8(KVibraCmdStatusCaseErrInsuffPriority, "VIBEPKT_CMD_STATUSCASEERRINSUFFPRIORITY");
+_LIT8(KVibraCmdStatusCaseSrvBusy, "VIBEPKT_CMD_STATUSCASESRVBUSY");
+_LIT8(KVibraCmdStatusCaseWrnNotPlaying, "VIBEPKT_CMD_STATUSCASEWRNNOTPLAYING");
+_LIT8(KVibraCmdStatusCaseWrnInsuffPriority, "VIBEPKT_CMD_STATUSCASEWRNINSUFFPRIORITY");
+
+const TInt KRespFileData = 3000;
+const TInt KHexRespCode = 100;
+const TInt KBinRespCode = 100;
+const TInt KTimeOut = 500;
+
+class CPluginTimer;
+
+/**
+ * Haptics test plugin.
+ * Test implementation that handles reception and responding to
+ * haptics commands in adaptation layer in semi-hardcoded manner.
+ * (Where semi-hardcoded means that responses are chosen, based on
+ * the current state of the test stub, from a file containing hardcoded
+ * response alternatives.
+ *
+ * @since S60 5.1
+ */
+class CHWRMHapticsTestPlugin : public CHWRMHapticsPluginService,
+ public MPluginTimerCallback
+ {
+public:
+ /**
+ * Static method for instantiating test plugin objects.
+ * Uses two-phase construction.
+ *
+ * @param aCallback Callback to haptics subsystem.
+ */
+ static CHWRMHapticsTestPlugin* NewL( MHWRMHapticsPluginCallback* aCallback );
+
+ /**
+ * Destructor
+ */
+ virtual ~CHWRMHapticsTestPlugin();
+
+ /**
+ * Method to invoke a particular command in the plugin.
+ * Implements the CHWRMHapticsPluginService::ProcessCommandL
+ * abstract interface method.
+ *
+ * @param aCommandId Command ID
+ * @param aTransId Transaction ID
+ * @param aData Data associated with command
+ */
+ virtual void ProcessCommandL( TInt aCommandId,
+ TUint8 aTransId,
+ TDesC8& aData );
+
+ /**
+ * Method to cancel a particular command.
+ * Implements the CHWRMHapticsPluginService::CancelCommandL
+ * abstract interface method.
+ *
+ * @param aTransId Transaction ID
+ * @param aCommandId Command ID to optionally double check with the
+ * transaction ID
+ */
+ virtual void CancelCommandL( TUint8 aTransId,
+ TInt aCommandId );
+
+ /**
+ * The callback method that is called from CPluginTimer when timer
+ * has expired.
+ * This method basically does all the processing needed to return a
+ * (emulated) response to a Haptics command.
+ *
+ * @param aService Pointer to the implementation of
+ * MHWRMHapticsPluginCallback callback
+ * interface whose ProcessResponseL is called
+ * with (Haptics command's emulated) response
+ * data.
+ * @param aCommandId Id of the (emulated) Haptics command.
+ * @param aTransId Id of the transaction to which the (emulated)
+ * haptics command belongs to.
+ * @param aRetVal Return value to be inserted to the response
+ * of the (emulated) Haptics command.
+ */
+ void GenericTimerFired(MHWRMHapticsPluginCallback* aService,
+ TInt aCommandId,
+ TUint8 aTransId,
+ TInt aRetVal);
+ /**
+ * Static method to convert hex string to binary format
+ *
+ * @param aSrcBuffer Reference to a descriptor containing the hex buffer.
+ * @param aDstBuffer Reference to a descriptor containing the buffer
+ * to which binary data is written.
+ */
+ static void Hex2Bin(const TDesC8& aSrcBuffer, TDes8& aDstBuffer);
+
+ /**
+ * Method that gets the hex data string from file buffer and converts it to binary format.
+ *
+ * @param aCmdPosition Command position in the file data. The command position
+ * is calculated in GenericTimerFired method based on
+ * emulated Haptics command's command Id
+ * @param aRetvalPackage Reference to a descriptor containing the buffer
+ * to which binary data is written.
+ */
+ void CHWRMHapticsTestPlugin::GetBinRespCode(TInt aCmdPosition, TDes8& aRetvalPackage);
+
+private:
+
+ /**
+ * Constructor.
+ *
+ * @param aCallback Callback to haptics subsystem.
+ */
+ CHWRMHapticsTestPlugin( MHWRMHapticsPluginCallback* aCallback );
+
+ /**
+ * Two-phase construction ConstructL
+ */
+ void ConstructL();
+
+
+private: // data
+
+ /**
+ * Array of pointers to running CPluginTimer timer objects
+ */
+ RPointerArray<CPluginTimer> iTimers;
+
+ /**
+ * File data buffer
+ */
+ TBuf8<KRespFileData> iFileData;
+
+ /**
+ * Emulated haptics command's response data
+ */
+ HWRMHapticsCommand::RHWRMHapticsRespData iStorage;
+
+ /**
+ * Emulated haptics command (stored as a VibeTonz packet pointer)
+ */
+ TVibePacket* iVibeCmdPacket;
+
+ /**
+ * Effect state. Used to distinguish (in an emulated way) different
+ * states of effect ("Playing","Paused","Not playing").
+ */
+ enum TEffectState
+ {
+ ENotPlaying = 0,
+ EPlaying,
+ EPaused
+ };
+ TEffectState iEffectState;
+
+#ifdef PUBLISH_STATE_INFO
+
+ /**
+ * P&S property for publishing (emulated) Haptics command's command Id
+ */
+ RProperty iCmdProperty;
+
+ /**
+ * P&S property for publishing (emulated) Haptics command's data
+ */
+ RProperty iDataProperty;
+
+ /**
+ * P&S property for publishing (emulated) Haptics command's Vibe command code
+ */
+ RProperty iVibeCmdProperty;
+#endif // PUBLISH_STATE_INFO
+ };
+
+#endif // __HWRMHAPTICSDPLUGIN_H_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/inc/plugintimer.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,180 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics test (adaptation) plugin timer header file
+*
+*/
+
+
+
+#ifndef __HWRMHAPTICSTESTPLUGINTIMER_H_
+#define __HWRMHAPTICSTESTPLUGINTIMER_H_
+
+#include <hwrmhapticspluginservice.h>
+
+/**
+ * An interface for handling timer expiration events.
+ *
+ * @since S60 5.1
+ */
+class MPluginTimerCallback
+ {
+public:
+ /**
+ * Method that is called when the timer expires.
+ * Must be implemented by classes that support this interface.
+ *
+ * @param aService Pointer to an object that implements
+ * the MHWRMHapticsPluginCallback interface
+ * and thus handles the callbacks from this
+ * test plugin. In practice this is pointer
+ * to the Haptics plugin manager object.
+ * @param aCommandId ID of the command that was being executed
+ * (or actually emulated as being executed)
+ * at the time the timer expired.
+ * @param aTransId Transaction ID of the command that was being executed
+ * (or actually emulated as being executed)
+ * at the time the timer expired.
+ * @param aRetVal (Emulated) return value of the command that was
+ * being executed (or actually emulated as being executed)
+ * at the time the timer expired.
+ */
+ virtual void GenericTimerFired( MHWRMHapticsPluginCallback* aService,
+ TInt aCommandId,
+ TUint8 aTransId,
+ TInt aRetVal ) = 0;
+ };
+
+
+/**
+ * Timer class that triggers command execution emulation. (This test
+ * stub emulates the real adaptation layer haptics command execution
+ * and the emulation "round" is triggered from this class).
+ *
+ * @since S60 5.1
+ */
+class CPluginTimer : public CTimer
+ {
+public:
+ /**
+ * Static method for instantiation.
+ * The instantiation also adds the instance to active scheduler and
+ * triggers start of the (embedded CTimer) timer.
+ *
+ * @param aInterval Timeout value for command execution emulation.
+ * @param aService Pointer to the object that handles the responses
+ * from command execution emulation. I.e., pointer
+ * to an object outside the test stub plugin that
+ * handles responses from all kinds of haptics plugins.
+ * In practice this is the Haptics plugin manager.
+ * @param aCommandId Id of the command whose execution is emulated.
+ * @param aTransId Id of the transaction to which the emulated command
+ * belongs to.
+ * @param aRetVal Return value of the emulated command.
+ * @param aCallback Pointer to the object that further handles the
+ * command emulation (i.e., pointer to the actual test
+ * stub plugin object).
+ */
+ static CPluginTimer* NewL(
+ const TTimeIntervalMicroSeconds32& aInterval,
+ MHWRMHapticsPluginCallback* aService,
+ TInt aCommandId,
+ TUint8 aTransId,
+ TInt aRetVal,
+ MPluginTimerCallback* aCallback);
+
+ /**
+ * Destructor
+ */
+ ~CPluginTimer();
+
+ /**
+ * RunL handles (embedded CTimer) timer expirations.
+ *
+ * @see CActive
+ * @see CTimer
+ */
+ void RunL();
+
+ /**
+ * Getter for transaction Id
+ */
+ TUint8 TransId() const;
+
+private:
+ /**
+ * Constructor
+ *
+ * @param aPriority
+ * @param aService Pointer to an object that implements
+ * the MHWRMHapticsPluginCallback interface
+ * and thus handles the callbacks from this
+ * whole test plugin.
+ * @param aCommandId Id of the command for which the timer-based
+ * command execution emulation is started.
+ * @param aTransId Transaction Id
+ * @param aRetVal
+ * @param aCallback Pointer to an object that implements the above
+ * declared MPluginTimerCallback interface. In
+ * practice this is the CHWRMHapticsTestPlugin
+ * object.
+ */
+ CPluginTimer( TInt aPriority,
+ MHWRMHapticsPluginCallback* aService,
+ TInt aCommandId,
+ TUint8 aTransId,
+ TInt aRetVal,
+ MPluginTimerCallback* aCallback );
+
+ /**
+ * Two-phase construction. ConstructL is needed because parent
+ * class (CTimer) requires two-phase construction.
+ */
+ void ConstructL();
+
+private: // data
+
+ /**
+ * Pointer to an object that handles responses from this
+ * test plugin (i.e., in practice the Haptics plugin manager).
+ */
+ MHWRMHapticsPluginCallback* iService; // Not owned
+
+ /**
+ * Id of the command whose execution is being emulated by
+ * the test plugin
+ */
+ TInt iCommandId;
+
+ /**
+ * Id of the transaction to which the command, whose execution
+ * is being emulated by the test plugin, belongs to
+ */
+ TUint8 iTransId;
+
+ /**
+ * Return value that the emulated command execution is to return.
+ */
+ TInt iRetVal;
+
+ /**
+ * Pointer to an object that further handles the timer expiries
+ * from this CPluginTimer object.
+ * I.e, pointer to the actual test plugin object
+ */
+ MPluginTimerCallback* iCallback; // Not owned
+
+ };
+
+
+#endif // __HWRMHAPTICSTESTPLUGINTIMER_H_
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/rom/hapticsadaptation.iby Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,28 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics adaptation test plugins IBY file.
+*
+*/
+
+
+#ifndef __HWRMHAPTICSTESTPLUGINS_IBY__
+#define __HWRMHAPTICSTESTPLUGINS_IBY__
+
+ECOM_PLUGIN( hapticsadaptation.dll , 2001CB6D.rsc )
+data=EPOCROOT##epoc32\data\z\system\apps\haptics\stubresponse.txt system\apps\haptics\stubresponse.txt
+
+
+#endif // __HWRMHAPTICSTESTPLUGINS_IBY__
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/src/hwrmhapticstestplugin.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,691 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics adaptation test plugin implementation.
+*
+*/
+
+#include <s32mem.h>
+#include <hwrmhapticscommands.h>
+
+#include "hwrmhapticstestplugin.h"
+#include "hwrmhapticstrace.h"
+#include "hwrmhapticsvibeconstants.h"
+#include "plugintimer.h"
+
+// -----------------------------------------------------------------------------
+// Enumeration for special test case in which it is tested that HapticsClient
+// correctly converts VibeStatus codes to Symbian/S60 error codes.
+// -----------------------------------------------------------------------------
+//
+enum vibestatustests
+ {
+ SUCCESS_TEST = 100,
+ ALREADY_INITIALIZED_TEST,
+ NOT_INITIALIZED_TEST,
+ INVALID_ARGUMENT_TEST,
+ FAIL_TEST,
+ INCOMPATIBLE_EFFECT_TYPE_TEST,
+ INCOMPATIBLE_CAPABILITY_TYPE_TEST,
+ INCOMPATIBLE_PROPERTY_TYPE_TEST,
+ DEVICE_NEEDS_LICENSE_TEST,
+ NOT_ENOUGH_MEMORY_TEST,
+ SERVICE_NOT_RUNNING_TEST,
+ INSUFFICIENT_PRIORITY_TEST,
+ SERVICE_BUSY_TEST,
+ WRN_NOT_PLAYING_TEST,
+ WRN_INSUFFICIENT_PRIORITY_TEST
+ };
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::NewL
+// Static instantiation method. Allocates mem and constructs new test plugin object.
+// -----------------------------------------------------------------------------
+//
+CHWRMHapticsTestPlugin* CHWRMHapticsTestPlugin::NewL(
+ MHWRMHapticsPluginCallback* aCallback )
+ {
+ COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::NewL()") ) );
+ CHWRMHapticsTestPlugin* self =
+ new ( ELeave ) CHWRMHapticsTestPlugin( aCallback );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::~CHWRMHapticsTestPlugin
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CHWRMHapticsTestPlugin::~CHWRMHapticsTestPlugin()
+ {
+ COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::~CFmtxPlugin()") ) );
+
+ iStorage.Close();
+
+ iTimers.ResetAndDestroy();
+ iVibeCmdPacket = NULL;
+ #ifdef PUBLISH_STATE_INFO
+ iCmdProperty.Close();
+ iDataProperty.Close();
+ iVibeCmdProperty.Close();
+#endif /* PUBLISH_STATE_INFO */
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::CHWRMHapticsTestPlugin
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CHWRMHapticsTestPlugin::CHWRMHapticsTestPlugin(
+ MHWRMHapticsPluginCallback* aCallback )
+ {
+ COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::CHWRMHapticsTestPlugin()") ) );
+ iResponseCallback = aCallback;
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::ConstructL
+// Two-phase construction ConstructL that can leave.
+// -----------------------------------------------------------------------------
+//
+void CHWRMHapticsTestPlugin::ConstructL()
+ {
+ COMPONENT_TRACE( ( _L("CHWRMHapticsTestPlugin::ConstructL") ) );
+
+ // Create response data buffer
+ iStorage.Create( KHWRMHapticsRespMaxSize );
+
+ // Read in response file contents
+ RFs fileServer;
+ User::LeaveIfError( fileServer.Connect() );
+
+ RFile file;
+ TInt err = file.Open( fileServer, KStubResponseFile, EFileRead );
+ if( err !=KErrNone )
+ COMPONENT_TRACE( _L("HWRM HapticsPlugin: Couldn't open file successfully") );
+
+ file.Read( iFileData );
+
+ file.Close();
+ fileServer.Close();
+
+#ifdef PUBLISH_STATE_INFO
+ RProperty::Define( KPSUidHWResourceNotification, KHWRMTestHapticsCommand, RProperty::EInt );
+ RProperty::Define( KPSUidHWResourceNotification, KHWRMTestHapticsDataPckg, RProperty::EByteArray, 512 );
+ RProperty::Define( KPSUidHWResourceNotification, KHWRMTestVibCmdData, RProperty::EInt );
+ iCmdProperty.Attach( KPSUidHWResourceNotification, KHWRMTestHapticsCommand );
+ iDataProperty.Attach( KPSUidHWResourceNotification, KHWRMTestHapticsDataPckg );
+ iVibeCmdProperty.Attach( KPSUidHWResourceNotification, KHWRMTestVibCmdData );
+#endif /* PUBLISH_STATE_INFO */
+
+ // inform haptics of the plugin state
+ iResponseCallback->PluginEnabled( EHWRMLogicalActuatorAny, ETrue );
+ iResponseCallback->PluginEnabled( EHWRMLogicalActuatorDevice, ETrue );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::ProcessCommandL
+// Implementation of CHWRMHapticsPluginService::ProcessCommandL.
+// This method processes the haptics command in adaptation layer. In this test
+// plugin simply a timer instance is created with the given data and later, after
+// the timer expiry, the semi-hard-coded response is created in GenericTimerFired
+// method below.
+// -----------------------------------------------------------------------------
+//
+void CHWRMHapticsTestPlugin::ProcessCommandL( TInt aCommandId,
+ TUint8 aTransId,
+ TDesC8& aData )
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Processing command: 0x%x, TransId: 0x%x" ), aCommandId, aTransId ) );
+
+ TInt retVal( KErrNone );
+
+ switch ( aCommandId )
+ {
+ case HWRMHapticsCommand::EHapticsCmdId :
+ {
+ COMPONENT_TRACE( _L("HWRM HapticsPlugin: Processed EHapticsCmdId") );
+ }
+ break;
+ default :
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Unknown Command: 0x%x" ), aCommandId ) );
+#ifdef _DEBUG
+ User::Invariant(); // panic here to notice the problem early
+#endif
+ }
+ break;
+ }
+
+
+ iVibeCmdPacket = reinterpret_cast<TVibePacket*>( const_cast<TUint8*>( aData.Ptr() ) );
+ // check for NULL pointer
+ if ( NULL == iVibeCmdPacket )
+ {
+ User::Leave( KErrBadDescriptor );
+ }
+
+ TInt timeout( KTimeOut );
+
+ _LIT8 ( KTestPluginMgrTransTimerExpires, "KTestPluginMgrTransTimerExpires" );
+ if ( aData.FindF ( KTestPluginMgrTransTimerExpires ) != KErrNotFound )
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: set the timeout that is more than plug-in manager transaction generic timer time-out period") ) );
+ // set the timeout that is more than plug-in manager transaction generic timer time-out period i.e. > KDefaultPluginTimeout
+ timeout = 4000000;
+ }
+
+#ifdef PUBLISH_STATE_INFO
+ // publish
+ iCmdProperty.Set( aCommandId );
+ iDataProperty.Set( aData );
+ iVibeCmdProperty.Set( iVibeCmdPacket->iSimpleRsp.iCmdCode );
+#endif /* PUBLISH_STATE_INFO */
+
+ // create new timer and append it to the timer (pointer) array
+ CPluginTimer* timer = CPluginTimer::NewL( timeout, iResponseCallback, aCommandId, aTransId, retVal, this );
+ CleanupStack::PushL( timer );
+ iTimers.AppendL( timer );
+ CleanupStack::Pop( timer );
+
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Processing command - return") ) );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::CancelCommandL
+// Implementation of CHWRMHapticsPluginService::CancelCommandL.
+// Method for cancelling ongoing (emulated) command execution. In practice
+// removes the timer that was started in order to emulate the given command.
+// -----------------------------------------------------------------------------
+//
+void CHWRMHapticsTestPlugin::CancelCommandL(
+ TUint8 aTransId,
+ TInt /*aCommandId*/ )
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Cancelling command - iTimers.Count(): %d " ), iTimers.Count() ) );
+
+ for( TInt i = 0; i < iTimers.Count(); i++ )
+ {
+ if ( iTimers[i]->TransId() == aTransId )
+ {
+ delete iTimers[i];
+ iTimers.Remove( i );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::GenericTimerFired
+// Callback method that is called from the CPluginTimer after timer expiry.
+// This method emulates reception of response from the ISA layer to a haptics
+// command. The actual response is read from a file, converted to binary and
+// then the Haptics plugin manager's callback method (ProcessResponseL) is
+// called with that binary data.
+// -----------------------------------------------------------------------------
+//
+void CHWRMHapticsTestPlugin::GenericTimerFired(
+ MHWRMHapticsPluginCallback* aService,
+ TInt aCommandId,
+ TUint8 aTransId,
+ TInt aRetVal )
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: GenericTimerFired (0x%x, 0x%x, %d)" ), aCommandId, aTransId, aRetVal ) );
+
+ __ASSERT_ALWAYS( aService != NULL, User::Invariant() );
+
+ TInt err = KErrNone;
+ TBuf8<KHWRMHapticsRespMaxSize> binRespData;
+ if ( NULL != iVibeCmdPacket )
+ {
+ TBool jumpCases = EFalse;
+
+ // Special case for vibeStatus to S60 err code manipulations:
+ if ( iVibeCmdPacket->iSimpleRsp.iCmdCode == KVibeCmdPlayIVTEffectNoData )
+ {
+ TVibePacketPlayIVTEffectRequest* playReq = reinterpret_cast<TVibePacketPlayIVTEffectRequest*>( iVibeCmdPacket );
+ if ( playReq )
+ {
+ jumpCases = ETrue;
+
+ // the repeat value is used to indicate which sub-case is ongoing..
+ // values between 100...114 are treated as special values.
+ switch ( playReq->iRepeat )
+ {
+ case SUCCESS_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_S_SUCCESS") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseSuccess ), binRespData );
+ break;
+ }
+ case ALREADY_INITIALIZED_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_ALREADY_INITIALIZED") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseAlreadyInit ), binRespData );
+ break;
+ }
+ case NOT_INITIALIZED_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_NOT_INITIALIZED") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseNotInit ), binRespData );
+ break;
+ }
+ case INVALID_ARGUMENT_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INVALID_ARGUMENT") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseInvalidArg ), binRespData );
+ break;
+ }
+ case FAIL_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_FAIL") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseFail ), binRespData );
+ break;
+ }
+ case INCOMPATIBLE_EFFECT_TYPE_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INCOMPATIBLE_EFFECT_TYPE") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseIncompEffType ), binRespData );
+ break;
+ }
+ case INCOMPATIBLE_CAPABILITY_TYPE_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INCOMPATIBLE_CAPABILITY_TYPE") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseIncompCapaType ), binRespData );
+ break;
+ }
+ case INCOMPATIBLE_PROPERTY_TYPE_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INCOMPATIBLE_PROPERTY_TYPE") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseIncompPropType ), binRespData );
+ break;
+ }
+ case DEVICE_NEEDS_LICENSE_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_DEVICE_NEEDS_LICENSE") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseDevNeedsLicense ), binRespData );
+ break;
+ }
+ case NOT_ENOUGH_MEMORY_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_NOT_ENOUGH_MEMORY") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseNotEnoughMem ), binRespData );
+ break;
+ }
+ case SERVICE_NOT_RUNNING_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_SERVICE_NOT_RUNNING") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseSrvNotRunning ), binRespData );
+ break;
+ }
+ case INSUFFICIENT_PRIORITY_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_INSUFFICIENT_PRIORITY") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseErrInsuffPriority ), binRespData );
+ break;
+ }
+ case SERVICE_BUSY_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_E_SERVICE_BUSY") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseSrvBusy ), binRespData );
+ break;
+ }
+ case WRN_NOT_PLAYING_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_W_NOT_PLAYING") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseWrnNotPlaying ), binRespData );
+ break;
+ }
+ case WRN_INSUFFICIENT_PRIORITY_TEST:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: Returning status VIBE_W_INSUFFICIENT_PRIORITY") ) );
+ this->GetBinRespCode( iFileData.Find( KVibraCmdStatusCaseWrnInsuffPriority ), binRespData );
+ break;
+ }
+ default:
+ {
+ jumpCases = EFalse;
+ break;
+ }
+ }
+ if ( jumpCases )
+ {
+ iEffectState = ENotPlaying;
+ }
+ }
+ }
+
+ if ( !jumpCases )
+ {
+ // Other cases..
+ switch( iVibeCmdPacket->iSimpleRsp.iCmdCode )
+ {
+
+ case KVibeCmdInitialize:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_INITIALIZE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdInitialize );
+ iEffectState = ENotPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdOpenDevice:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_OPENDEVICE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdOpenDevice );
+ iEffectState = ENotPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdSetDeviceProperty:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_SETDEVICEPROPERTY command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdSetDeviceProperty );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdPlayMagSweepEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYMAGSWEEPEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdPlayMagSweepEffect );
+ iEffectState = EPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdCloseDevice:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_CLOSEDEVICE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdCloseDevice );
+ iEffectState = ENotPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdDeviceCount:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_DEVICE_COUNT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdDeviceCount );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdGetDeviceProperty:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETDEVICEPROPERTY command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = 0;
+ switch (iVibeCmdPacket->iGetDevicePropertyReq.iPropertyValueType)
+ {
+ case KVibeValuetypeInt32:
+ pos = iFileData.Find( KVibraCmdGetDevicePropertyInteger );
+ break;
+ case KVibeValuetypeString:
+ pos = iFileData.Find( KVibraCmdGetDevicePropertyString );
+ break;
+ case KVibeValuetypeBool:
+ pos = iFileData.Find( KVibraCmdGetDevicePropertyBool );
+ break;
+ default:
+#ifdef _DEBUG
+ User::Invariant(); // wrong value type
+#endif
+ ;
+ }
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdGetDeviceState:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETDEVICESTATE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdGetDeviceState );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdGetDeviceCapabilities:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETDEVICECAPABILITIES command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = 0;
+ switch (iVibeCmdPacket->iGetDeviceCapsReq.iCapabilityValueType)
+ {
+ case KVibeValuetypeInt32:
+ pos = iFileData.Find( KVibraCmdGetDeviceCapabilitiesInteger );
+ break;
+ case KVibeValuetypeString:
+ pos = iFileData.Find( KVibraCmdGetDeviceCapabilitiesString );
+ break;
+ default:
+#ifdef _DEBUG
+ User::Invariant(); // wrong value type
+#endif
+ ;
+ }
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdPlayPeriodicEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYPERIODICEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdPlayPeriodicEffect );
+ iEffectState = EPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdPlayIVTEffectIncludeData:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYIVTEFFECT_INCLUDEIVTDATA command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdPlayIVTEffectIncludeIVTData );
+ iEffectState = EPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdPlayIVTEffectNoData:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYIVTEFFECT_NOIVTDATA command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdPlayIVTEffectNoIVTData );
+ iEffectState = EPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdStopEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_STOPEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdStopEffect );
+ iEffectState = ENotPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdStopAllEffects:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_STOPALLEFFECTS command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdStopAllEffects );
+ iEffectState = ENotPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdPlayStreamingSample:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PLAYSTREAMINGSAMPLE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdPlayStreamingSample );
+ iEffectState = EPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+
+ case KVibeCmdCreateStreamingEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_CREATESTREAMINGEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdCreateStreamingEffect );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdDestroyStreamingEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_DESTROYSTREAMINGEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdDestroyStreamingEffect );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdModifyPlayingMagSweepEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_MODIFYPLAYINGMAGSWEEPEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdModifyPlayingMagSweepEffect );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdModifyPlayingPeriodicEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_MODIFYPLAYINGPERIODICEFFECT: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdModifyPlayingPeriodicEffect );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdPausePlayingEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_PAUSEPLAYINGEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdPausePlayingEffect );
+ iEffectState = EPaused;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdResumePausedEffect:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_RESUMEPAUSEDEFFECT command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdResumePausedEffect );
+ iEffectState = EPlaying;
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+
+ case KVibeCmdGetEffectState:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETEFFECTSTATE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos;
+ if ( iEffectState == ENotPlaying )
+ {
+ pos = iFileData.Find( KVibraCmdGetEffectStateNotPlaying );
+ }
+ else if ( iEffectState == EPlaying )
+ {
+ pos = iFileData.Find( KVibraCmdGetEffectStatePlaying );
+ }
+ else
+ {
+ pos = iFileData.Find( KVibraCmdGetEffectStatePaused );
+ }
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdSetKernelParameter:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_SETKERNELPARAMETER command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdSetKernelParameter );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdGetKernelParameter:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_GETKERNELPARAMETER command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdGetKernelParameter );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ case KVibeCmdSetLicense:
+ {
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: VIBEPKT_CMD_SETLICENSE command: 0x%x" ), iVibeCmdPacket->iSimpleRsp.iCmdCode ) );
+ TInt pos = iFileData.Find( KVibraCmdSetLicense );
+ this->GetBinRespCode( pos, binRespData );
+ break;
+ }
+ default:
+ {
+ // do panic --> packetized message not recognized
+ break;
+ }
+ }//switch
+ }
+
+ CHWRMHapticsRespData* respData;
+ TInt32 errorCode( KErrNone );
+ respData = CHWRMHapticsRespData::NewLC( errorCode, binRespData );
+ RDesWriteStream writer( iStorage );
+ CleanupClosePushL( writer );
+ // write to resp data
+ writer << *respData;
+ // remove from stack , it will commit the actual data to the stoarage.
+ CleanupStack::PopAndDestroy( &writer );
+ CleanupStack::PopAndDestroy( respData );
+
+ } // if block end for pRsp check
+
+
+ TRAP( err, aService->ProcessResponseL( aCommandId, aTransId, iStorage ) );
+ // delete obsolete timers
+ for( TInt i = ( iTimers.Count()-1 ); i > -1 ; i-- )
+ {
+ if ( !iTimers[i]->IsActive() )
+ {
+ delete iTimers[i];
+ iTimers.Remove( i );
+ COMPONENT_TRACE( ( _L("HWRM HapticsPlugin: GenericTimerFired - Removed obsolete timer") ) );
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::Hex2Bin
+// Converts hexadecimal string given as first parameter to binary data that is
+// stored to the object referenced by the second parameter.
+// -----------------------------------------------------------------------------
+//
+void CHWRMHapticsTestPlugin::Hex2Bin( const TDesC8& aSrcBuffer, TDes8& aDstBuffer )
+ {
+ TInt len = aSrcBuffer.Length();
+ aDstBuffer.SetLength( len >> 1 );
+ for ( TInt n=0; n<len; n+=2 )
+ {
+ TUint8 hiNibble = ( (aSrcBuffer[n] > '9' ) ? aSrcBuffer[n] - 'A' + 10: aSrcBuffer[n] - '0' );
+ TUint8 loNibble = ( (aSrcBuffer[n+1] > '9' ) ? aSrcBuffer[n+1] - 'A' + 10: aSrcBuffer[n+1] - '0' );
+
+ aDstBuffer[n>>1] = static_cast<TUint8>( ( ( hiNibble << 4 ) + loNibble ) );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMHapticsTestPlugin::GetBinRespCode
+// Helper method that gets the response data string from given position (line)
+// of the (buffered in) response data file, and with the above Hex2Bin method
+// converts the string into binary data that is then stored to the TDes8 object
+// whose reference is given as second param (aBinRespData).
+// -----------------------------------------------------------------------------
+//
+void CHWRMHapticsTestPlugin::GetBinRespCode( TInt aCmdPosition, TDes8& aBinRespData )
+ {
+ TBuf8<KRespFileData> tempFileData;
+ TBuf8<KHexRespCode> hexRespCode;
+
+ tempFileData.Copy( iFileData.Mid( aCmdPosition ) );
+ TInt pos2 = tempFileData.Locate( '"' );
+ TInt pos3 = tempFileData.Locate( '\r' );
+ TInt respCodeLength = ( pos3-2 ) - pos2;
+
+ hexRespCode.Copy( tempFileData.Mid( pos2+1, respCodeLength ) );
+
+ CHWRMHapticsTestPlugin::Hex2Bin( hexRespCode, aBinRespData );
+ }
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/src/plugintimer.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,118 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics test adaptation plugin timer implementation
+*
+*/
+
+
+#include "plugintimer.h"
+#include <hwrmpluginservice.h>
+#include <hwrmvibracommands.h>
+#include "hwrmhapticstrace.h"
+
+// -----------------------------------------------------------------------------
+// CPluginTimer::NewL
+// Instantiates a CPluginTimer object.
+// Also adds the newly constructed object to active scheduler and starts the
+// embedded CTimer through After() method call.
+// -----------------------------------------------------------------------------
+//
+CPluginTimer* CPluginTimer::NewL(
+ const TTimeIntervalMicroSeconds32& aInterval,
+ MHWRMHapticsPluginCallback* aService,
+ TInt aCommandId,
+ TUint8 aTransId,
+ TInt aRetVal,
+ MPluginTimerCallback* aCallback )
+ {
+ CPluginTimer* self = new( ELeave ) CPluginTimer( 0, aService, aCommandId, aTransId, aRetVal, aCallback );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ CActiveScheduler::Add( self );
+
+ COMPONENT_TRACE( (_L("HWRM Plugin - CPluginTimer::NewL - Setting timer: %d"), aInterval) );
+
+ self->After( aInterval );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CPluginTimer::~CPluginTimer
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CPluginTimer::~CPluginTimer()
+ {
+ // PCLint demands
+ iCallback = NULL;
+ iService = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CPluginTimer::CPluginTimer
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CPluginTimer::CPluginTimer( TInt aPriority,
+ MHWRMHapticsPluginCallback* aService,
+ TInt aCommandId,
+ TUint8 aTransId,
+ TInt aRetVal,
+ MPluginTimerCallback* aCallback )
+ : CTimer( aPriority ),
+ iService( aService ),
+ iCommandId( aCommandId ),
+ iTransId( aTransId ),
+ iRetVal( aRetVal ),
+ iCallback( aCallback )
+ {
+ // empty
+ }
+
+// -----------------------------------------------------------------------------
+// CPluginTimer::ConstructL
+// Two-phase (leavable) construction method. Calls the parent class ConstructL.
+// -----------------------------------------------------------------------------
+//
+void CPluginTimer::ConstructL()
+ {
+ CTimer::ConstructL();
+ }
+
+// -----------------------------------------------------------------------------
+// CPluginTimer::RunL
+// Active scheduler calls RunL when timer expires. This in turn dispatches the
+// further handling to the test stub object through MPluginTimerCallback interface.
+// -----------------------------------------------------------------------------
+//
+void CPluginTimer::RunL()
+ {
+ iCallback->GenericTimerFired( iService, iCommandId, iTransId, iRetVal );
+ }
+
+// -----------------------------------------------------------------------------
+// CPluginTimer::TransId
+// Getter method for transaction Id.
+// -----------------------------------------------------------------------------
+//
+TUint8 CPluginTimer::TransId() const
+ {
+ return iTransId;
+ }
+
+// End of files
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/tsrc/hapticstestplugins/src/proxy.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Haptics adaptation test plugin ECom implementation proxy definition file
+*
+*/
+
+
+#include <e32std.h>
+#include <ecom/ImplementationProxy.h>
+
+#include "hwrmhapticstestplugin.h"
+
+/**
+ * Mapping of the interface implementation UIDs to implementation factory functions
+ */
+const TImplementationProxy ImplementationTable[] =
+ {
+ IMPLEMENTATION_PROXY_ENTRY( 0x2001CB6E, CHWRMHapticsTestPlugin::NewL )
+ };
+
+/**
+ * Exported proxy for instantiation method resolution.
+ */
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount )
+ {
+ aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+ return ImplementationTable;
+ }
--- a/package_definition.xml Wed Sep 29 15:13:21 2010 +0300
+++ b/package_definition.xml Fri Oct 08 14:33:25 2010 +0300
@@ -141,6 +141,9 @@
<meta rel="Api" href="devicesrv_plat/accessory_policy_utility_api/accessory_policy_utility_api.metaxml"/>
<unit bldFile="devicesrv_plat/accessory_policy_utility_api/group"/>
</component>
+ <component id="common_accessory_plugin_api" name="Common Accessory Plugin API" class="api" filter="s60">
+ <unit bldFile="devicesrv_plat/common_accessory_plugin_api/group"/>
+ </component>
<component id="common_dsy_plugin_api" name="Common DSY Plugin API" class="api" filter="s60">
<meta rel="Api" href="devicesrv_plat/common_dsy_plugin_api/common_dsy_plugin_api.metaxml"/>
<unit bldFile="devicesrv_plat/common_dsy_plugin_api/group"/>
--- a/resourcemgmt/hwresourcesmgr/server/src/HWRMVibraService.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMVibraService.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -522,10 +522,11 @@
CHWRMGenericTimer* timer =
CHWRMGenericTimer::NewL(*this, iVibraCommonData.MaximumOnTime(), count );
iActiveTimerId = count;
+ CleanupStack::PushL( timer );
CPulseData* pulseData = CPulseData::NewL(*timer, iLastIntensity, aIntensity, iActiveTimerId );
CleanupStack::PushL( pulseData );
iPulseData.AppendL( pulseData );
- CleanupStack::Pop( pulseData );
+ CleanupStack::Pop( 2, timer );
iPulseData[count]->Timer().Set(aDuration);
}
--- a/resourcemgmt/hwrmfmtxwatcherplugin/src/hwrmfmtxaccobserver.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/resourcemgmt/hwrmfmtxwatcherplugin/src/hwrmfmtxaccobserver.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -17,7 +17,7 @@
// INCLUDE FILES
-#include <accessoryservicesinternalpskeys.h>
+#include <accessoryservicespskeys.h>
#include "hwrmfmtxaccobserver.h"
#include "trace.h"
--- a/sensorservices/sensorserver/src/server/sensrvsession.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sensorservices/sensorserver/src/server/sensrvsession.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -53,9 +53,13 @@
CSensrvSession* self = new( ELeave ) CSensrvSession(aServer, aProxyManager, aSecureId);
+ CleanupStack::PushL(self);
+
self->ConstructL();
COMPONENT_TRACE( ( _L( "Sensor Server - CSensrvSession::NewL - return 0x%x" ), self ) );
+
+ CleanupStack::Pop(self);
return self;
}
--- a/sysstatemgmt/ssmcmdlists/data/noncriticalcmdlist_hw.rss Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/ssmcmdlists/data/noncriticalcmdlist_hw.rss Fri Oct 08 14:33:25 2010 +0300
@@ -80,6 +80,8 @@
#ifdef FF_MOBILITY_MANAGEMENT_ERRORS
,r_cmd_item_nwnotifier
#endif // FF_MOBILITY_MANAGEMENT_ERRORS
+ // prio 0x7EEA
+ ,r_cmd_logs //PMES-83ZD5M
};
}
@@ -129,7 +131,18 @@
timeout = 10000;
background = 1; // To background
}
-
+
+// ---------------------------------------------------------------------------
+// r_cmd_logs
+// ---------------------------------------------------------------------------
+//
+RESOURCE SSM_START_PROCESS_INFO r_cmd_logs
+ {
+ priority = 0x7EEA;
+ name = "logs.exe";
+ execution_behaviour = ESsmFireAndForget;
+ args = "-logsbootup";
+ }
// ---------------------------------------------------------------------------
// r_cmd_provisioning
--- a/sysstatemgmt/systemstatemgr/cmn/bwins/ssmcmn_graceful_shutdownu.def Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/bwins/ssmcmn_graceful_shutdownu.def Fri Oct 08 14:33:25 2010 +0300
@@ -99,4 +99,13 @@
?IsSsmGracefulOffline@@YAKXZ @ 98 NONAME ; unsigned long IsSsmGracefulOffline(void)
?KSsmGracefulOffline@@3KB @ 99 NONAME ; unsigned long const KSsmGracefulOffline
?KSsmInvalidSim@@3KB @ 100 NONAME ; unsigned long const KSsmInvalidSim
+ ?RequestStateNotificationCancel@CSsmStateAwareSession2@@QAEXXZ @ 101 NONAME ; void CSsmStateAwareSession2::RequestStateNotificationCancel(void)
+ ?AcknowledgeAndRequestStateNotification@CSsmStateAwareSession2@@QAEXH@Z @ 102 NONAME ; void CSsmStateAwareSession2::AcknowledgeAndRequestStateNotification(int)
+ ?GetState@CSsmStateAwareSession2@@QAE?AVTSsmState@@XZ @ 103 NONAME ; class TSsmState CSsmStateAwareSession2::GetState(void)
+ ?CancelDeferral@RSsmStateAwareSession@@QAEXXZ @ 104 NONAME ; void RSsmStateAwareSession::CancelDeferral(void)
+ ?NewL@CSsmStateAwareSession2@@SAPAV1@GAAVMStateChangeNotificationSubscriber2@@@Z @ 105 NONAME ; class CSsmStateAwareSession2 * CSsmStateAwareSession2::NewL(unsigned short, class MStateChangeNotificationSubscriber2 &)
+ ?DeferAcknowledgement@RSsmStateAwareSession@@QAEXAAVTRequestStatus@@@Z @ 106 NONAME ; void RSsmStateAwareSession::DeferAcknowledgement(class TRequestStatus &)
+ ?AcknowledgeStateNotification@CSsmStateAwareSession2@@QAEXH@Z @ 107 NONAME ; void CSsmStateAwareSession2::AcknowledgeStateNotification(int)
+ ?RequestStateNotification@CSsmStateAwareSession2@@QAEXXZ @ 108 NONAME ; void CSsmStateAwareSession2::RequestStateNotification(void)
+ ??1CSsmStateAwareSession2@@UAE@XZ @ 109 NONAME ; CSsmStateAwareSession2::~CSsmStateAwareSession2(void)
--- a/sysstatemgmt/systemstatemgr/cmn/bwins/ssmcmnu.def Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/bwins/ssmcmnu.def Fri Oct 08 14:33:25 2010 +0300
@@ -99,4 +99,13 @@
?IsSsmGracefulOffline@@YAKXZ @ 98 NONAME ; unsigned long IsSsmGracefulOffline(void)
?KSsmGracefulOffline@@3KB @ 99 NONAME ; unsigned long const KSsmGracefulOffline
?KSsmInvalidSim@@3KB @ 100 NONAME ; unsigned long const KSsmInvalidSim
+ ?RequestStateNotificationCancel@CSsmStateAwareSession2@@QAEXXZ @ 101 NONAME ; void CSsmStateAwareSession2::RequestStateNotificationCancel(void)
+ ?AcknowledgeAndRequestStateNotification@CSsmStateAwareSession2@@QAEXH@Z @ 102 NONAME ; void CSsmStateAwareSession2::AcknowledgeAndRequestStateNotification(int)
+ ?GetState@CSsmStateAwareSession2@@QAE?AVTSsmState@@XZ @ 103 NONAME ; class TSsmState CSsmStateAwareSession2::GetState(void)
+ ?CancelDeferral@RSsmStateAwareSession@@QAEXXZ @ 104 NONAME ; void RSsmStateAwareSession::CancelDeferral(void)
+ ?NewL@CSsmStateAwareSession2@@SAPAV1@GAAVMStateChangeNotificationSubscriber2@@@Z @ 105 NONAME ; class CSsmStateAwareSession2 * CSsmStateAwareSession2::NewL(unsigned short, class MStateChangeNotificationSubscriber2 &)
+ ?DeferAcknowledgement@RSsmStateAwareSession@@QAEXAAVTRequestStatus@@@Z @ 106 NONAME ; void RSsmStateAwareSession::DeferAcknowledgement(class TRequestStatus &)
+ ?AcknowledgeStateNotification@CSsmStateAwareSession2@@QAEXH@Z @ 107 NONAME ; void CSsmStateAwareSession2::AcknowledgeStateNotification(int)
+ ?RequestStateNotification@CSsmStateAwareSession2@@QAEXXZ @ 108 NONAME ; void CSsmStateAwareSession2::RequestStateNotification(void)
+ ??1CSsmStateAwareSession2@@UAE@XZ @ 109 NONAME ; CSsmStateAwareSession2::~CSsmStateAwareSession2(void)
--- a/sysstatemgmt/systemstatemgr/cmn/eabi/ssmcmn_graceful_shutdownu.def Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/eabi/ssmcmn_graceful_shutdownu.def Fri Oct 08 14:33:25 2010 +0300
@@ -117,4 +117,15 @@
KSsmGracefulOffline @ 116 NONAME DATA 4
_Z20IsSsmGracefulOfflinev @ 117 NONAME
KSsmInvalidSim @ 118 NONAME DATA 4
+ _ZN21RSsmStateAwareSession14CancelDeferralEv @ 119 NONAME
+ _ZN21RSsmStateAwareSession20DeferAcknowledgementER14TRequestStatus @ 120 NONAME
+ _ZN22CSsmStateAwareSession224RequestStateNotificationEv @ 121 NONAME
+ _ZN22CSsmStateAwareSession228AcknowledgeStateNotificationEi @ 122 NONAME
+ _ZN22CSsmStateAwareSession230RequestStateNotificationCancelEv @ 123 NONAME
+ _ZN22CSsmStateAwareSession238AcknowledgeAndRequestStateNotificationEi @ 124 NONAME
+ _ZN22CSsmStateAwareSession24NewLEtR35MStateChangeNotificationSubscriber2 @ 125 NONAME
+ _ZN22CSsmStateAwareSession28GetStateEv @ 126 NONAME
+ _ZN22CSsmStateAwareSession2D0Ev @ 127 NONAME
+ _ZN22CSsmStateAwareSession2D1Ev @ 128 NONAME
+ _ZN22CSsmStateAwareSession2D2Ev @ 129 NONAME
--- a/sysstatemgmt/systemstatemgr/cmn/eabi/ssmcmnu.def Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/eabi/ssmcmnu.def Fri Oct 08 14:33:25 2010 +0300
@@ -117,4 +117,15 @@
KSsmGracefulOffline @ 116 NONAME DATA 4
_Z20IsSsmGracefulOfflinev @ 117 NONAME
KSsmInvalidSim @ 118 NONAME DATA 4
+ _ZN21RSsmStateAwareSession14CancelDeferralEv @ 119 NONAME
+ _ZN21RSsmStateAwareSession20DeferAcknowledgementER14TRequestStatus @ 120 NONAME
+ _ZN22CSsmStateAwareSession224RequestStateNotificationEv @ 121 NONAME
+ _ZN22CSsmStateAwareSession228AcknowledgeStateNotificationEi @ 122 NONAME
+ _ZN22CSsmStateAwareSession230RequestStateNotificationCancelEv @ 123 NONAME
+ _ZN22CSsmStateAwareSession238AcknowledgeAndRequestStateNotificationEi @ 124 NONAME
+ _ZN22CSsmStateAwareSession24NewLEtR35MStateChangeNotificationSubscriber2 @ 125 NONAME
+ _ZN22CSsmStateAwareSession28GetStateEv @ 126 NONAME
+ _ZN22CSsmStateAwareSession2D0Ev @ 127 NONAME
+ _ZN22CSsmStateAwareSession2D1Ev @ 128 NONAME
+ _ZN22CSsmStateAwareSession2D2Ev @ 129 NONAME
--- a/sysstatemgmt/systemstatemgr/cmn/inc/cmnpanic.h Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/inc/cmnpanic.h Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -26,24 +26,29 @@
ECmnPropMonError1 = 1,
//CSsmStateMonitor errors
- ECmnStateMonError1,
+ ECmnStateMonError1 = 2,
//CSsmSystemWideProperty errors
- ECmnSwpSession1,
+ ECmnSwpSession1 = 3,
//SsmStateAwareSession errors
- ECmnErrState,
- ECmnErrRqstStateNotif,
- ECmnErrRqstStateNotifCancel,
- ECmnErrAcknldgStateNotif,
- ECmnErrAcknldgRqstStateNotif,
- ECmnErrStateMon,
+ ECmnErrState = 4,
+ ECmnErrRqstStateNotif = 5,
+ ECmnErrRqstStateNotifCancel = 6,
+ ECmnErrAcknldgStateNotif = 7,
+ ECmnErrAcknldgRqstStateNotif = 8,
+ ECmnErrStateMon = 9,
+ ECmnErrDeferAcknNotif = 10,
+ ECmnErrCancelDeferNotif = 11,
//TSsmState errors
- ECmnStateMaxValue1, //Out of range value supplied to the main state in TSsmState::TSsmState()
- ECmnStateMaxValue2, //Out of range value supplied to the main state in TSsmState::TSsmState()
- ECmnStateMaxValue3, //Out of range value supplied to the main state in TSsmState::Set()
- ECmnStateMaxValue4 //Out of range value supplied to the main state in TSsmState::SetFromInt()
+ ECmnStateMaxValue1 = 12, //Out of range value supplied to the main state in TSsmState::TSsmState()
+ ECmnStateMaxValue2 = 13, //Out of range value supplied to the main state in TSsmState::TSsmState()
+ ECmnStateMaxValue3 = 14, //Out of range value supplied to the main state in TSsmState::Set()
+ ECmnStateMaxValue4 = 15, //Out of range value supplied to the main state in TSsmState::SetFromInt()
+
+ //CSsmDeferralMonitor
+ ECmnErrDeferNotif = 16
};
#endif // __CMNPANICCODES_H__
--- a/sysstatemgmt/systemstatemgr/cmn/inc/ssmstatemonitor.h Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/inc/ssmstatemonitor.h Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -48,5 +48,44 @@
TSsmState iState;
};
+/**
+This active object will, once activated, repeatedly attempt to defer
+a transition deadline.
+It will stop once an attempt to defer fails eg. because deferral
+was cancelled or the transition was acknowledged or the deferral limit was reached.
+@internalComponent
+@released
+*/
+NONSHARABLE_CLASS(CSsmDeferralMonitor) : public CActive
+ {
+public:
+ CSsmDeferralMonitor(RSsmStateAwareSession& aStateAwareSession, CSsmStateAwareSession2& aOwnerActiveObject);
+ ~CSsmDeferralMonitor();
+
+ /**
+ Request deadline deferral for the last transition
+ notification
+ */
+ void DeferNotification();
+ void NotifyOfAcknowledgement();
+
+protected:
+ /**
+ Re-call DeferNotification(), unless the previous
+ call completed with an error.
+ */
+ void RunL();
+
+ /**
+ Handle errors thrown from RunL() - call HandleDeferralErrror()
+ */
+ TInt RunError(TInt aError);
+ void DoCancel();
+private:
+ RSsmStateAwareSession& iSsmStateAwareSession;
+ CSsmStateAwareSession2& iOwnerActiveObject;
+ TBool iCeaseDeferral;
+ };
+
#endif
--- a/sysstatemgmt/systemstatemgr/cmn/src/ssmstateawaresession.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/src/ssmstateawaresession.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -25,15 +25,6 @@
@internalComponent
@released
*/
-static void Panic(TInt aReason)
- {
- User::Panic(KPanicSsmCmn, aReason);
- }
-
-/**
- @internalComponent
- @released
- */
class RSsmStateAwareSession::RPrivateImpl : public RDmDomain
{
};
@@ -91,7 +82,7 @@
*/
EXPORT_C TSsmState RSsmStateAwareSession::State() const
{
- __ASSERT_ALWAYS(iPimpl, Panic(ECmnErrState));
+ __ASSERT_ALWAYS(iPimpl, User::Panic(KPanicSsmCmn, ECmnErrState));
TUint32 ds = 0;
//returned TDmDomainState is currently only 8 bits
@@ -108,7 +99,7 @@
*/
EXPORT_C void RSsmStateAwareSession::RequestStateNotification(TRequestStatus& aStatus)
{
- __ASSERT_ALWAYS(iPimpl, Panic(ECmnErrRqstStateNotif));
+ __ASSERT_ALWAYS(iPimpl, User::Panic(KPanicSsmCmn, ECmnErrRqstStateNotif));
iPimpl->RequestTransitionNotification(aStatus); //lint !e613 Possible use of NULL pointer - caught by ASSERT_ALWAYS
}
@@ -118,7 +109,7 @@
*/
EXPORT_C void RSsmStateAwareSession::RequestStateNotificationCancel()
{
- __ASSERT_ALWAYS(iPimpl, Panic(ECmnErrRqstStateNotifCancel));
+ __ASSERT_ALWAYS(iPimpl, User::Panic(KPanicSsmCmn, ECmnErrRqstStateNotifCancel));
iPimpl->CancelTransitionNotification(); //lint !e613 Possible use of NULL pointer - caught by ASSERT_ALWAYS
}
@@ -131,7 +122,7 @@
*/
EXPORT_C void RSsmStateAwareSession::AcknowledgeStateNotification(TInt aError)
{
- __ASSERT_ALWAYS(iPimpl, Panic(ECmnErrAcknldgStateNotif));
+ __ASSERT_ALWAYS(iPimpl, User::Panic(KPanicSsmCmn, ECmnErrAcknldgStateNotif));
iPimpl->AcknowledgeLastState(aError); //lint !e613 Possible use of NULL pointer - caught by ASSERT_ALWAYS
}
@@ -143,13 +134,83 @@
*/
EXPORT_C void RSsmStateAwareSession::AcknowledgeAndRequestStateNotification(TInt aError, TRequestStatus& aStatus)
{
- __ASSERT_ALWAYS(iPimpl, Panic(ECmnErrAcknldgRqstStateNotif));
+ __ASSERT_ALWAYS(iPimpl, User::Panic(KPanicSsmCmn, ECmnErrAcknldgRqstStateNotif));
//Typical pattern of using P&S is to subscribe first then get current state
iPimpl->RequestTransitionNotification(aStatus); //lint !e613 Possible use of NULL pointer - caught by ASSERT_ALWAYS
//Tell domain manager that we have processed the last state change.
iPimpl->AcknowledgeLastState(aError); //lint !e613 Possible use of NULL pointer - caught by ASSERT_ALWAYS
}
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+/**
+Defers the acknowledgement requesting more time.
+To be sure of deferring in time a client should call this immediately
+after receiving notification. This asynchronous call will complete once the original deadline
+is reached (ie. one period earlier than the final deadline), at which point the member must either
+defer again or acknowledge the transition. In the meantime, the member should perform
+its transition actions, whilst remaining responsive to new completion events.
+
+@note Deferrals are not always possible,
+whether the member will actually be given more time depends on if
+ - The current transition allows deferrals at all.
+ - The member still has deferrals left - there may be a maximum number
+ allowed.
+ - The deferral request was received in time.
+
+@param aStatus Status of request
+ - KErrNone Request has completed i.e. The member must either defer again or acknowledge.
+ - KErrCompletion The deferral was obsoleted by a subsequent call to AcknowledgeLastState.
+ - KErrNotSupported The current transition may not be deferred, or maximum deferral count reached.
+ - KErrCancel The deferral was cancelled.
+ - KErrNotReady Deferral attempted before a transition notification was received
+ or after the deadline for the previous one.
+ - KErrPermissionDenied The member lacked the necessary capabilities.
+ - KErrAlreadyExists A deferral was already outstanding.
+ Both new and existing calls will complete with this error.
+
+This function is provided for members to inform the Domain Manager that they
+are still active and are responding to a transition notification.
+For example, a server may have to persist data using
+the file server before shut down. Since this task should be allowed to complete
+before shutdown continues, the member should defer the transition, and then persist
+the data, using asynchronous calls.
+
+At least one of the below capabilities is required in order to defer a
+domain transition. Without them, the client will get KErrPermissionDenied.
+
+@capability WriteDeviceData
+@capability ProtServ
+
+@pre The member has been notified of a transition which it has not yet acknowledged.
+ */
+EXPORT_C void RSsmStateAwareSession::DeferAcknowledgement(TRequestStatus& aStatus)
+ {
+ __ASSERT_ALWAYS(iPimpl, User::Panic(KPanicSsmCmn, ECmnErrDeferAcknNotif));
+ iPimpl->DeferAcknowledgement(aStatus); //lint !e613 Possible use of NULL pointer - caught by ASSERT_ALWAYS
+
+ }
+
+/**
+Cancels the deferred call.
+Will cancel a call of DeferAcknowledgement, if one was pending.
+If none was pending, it does nothing.
+*/
+EXPORT_C void RSsmStateAwareSession::CancelDeferral()
+ {
+ __ASSERT_ALWAYS(iPimpl, User::Panic(KPanicSsmCmn, ECmnErrCancelDeferNotif));
+ iPimpl->CancelDeferral(); //lint !e613 Possible use of NULL pointer - caught by ASSERT_ALWAYS
+ }
+#else
+EXPORT_C void RSsmStateAwareSession::DeferAcknowledgement(TRequestStatus& aStatus)
+ {
+ TRequestStatus* pStatus = &aStatus;
+ User::RequestComplete(pStatus, KErrNotSupported);
+ }
+
+EXPORT_C void RSsmStateAwareSession::CancelDeferral()
+ {
+ }
+#endif
//
//---------------- class CSsmStateAwareSession ------------------
//
@@ -218,7 +279,7 @@
*/
EXPORT_C TSsmState CSsmStateAwareSession::State() const
{
- __ASSERT_ALWAYS(iMonitor, Panic(ECmnErrStateMon));
+ __ASSERT_ALWAYS(iMonitor, User::Panic(KPanicSsmCmn, ECmnErrStateMon));
return iMonitor->State();
}
@@ -270,3 +331,178 @@
#endif
}
} //lint !e1746 Suppress parameter 'aSsmState' could be made const reference
+
+//
+//---------------- class CExtendedSsmStateAwareSession ------------------
+//
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+/**
+Factory method that returns an instance of this object, connected to the domain
+identified by the specified domain Id and setup to subscribe on System State changes.
+@param aDomainId The Id of the domain to connect to.
+@param aSubscriber reference to MStateChangeNotificationSubscriber2
+*/
+EXPORT_C CSsmStateAwareSession2* CSsmStateAwareSession2::NewL(TDmDomainId aDomainId, MStateChangeNotificationSubscriber2& aSubscriber)
+ {
+ CSsmStateAwareSession2* self = new (ELeave)CSsmStateAwareSession2(aSubscriber);
+ CleanupStack::PushL(self);
+ self->ConstructL(aDomainId);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CSsmStateAwareSession2::CSsmStateAwareSession2(MStateChangeNotificationSubscriber2& aSubscriber):
+CActive(CActive::EPriorityStandard), iDeferNotification(NULL), iSubscriber(&aSubscriber)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CSsmStateAwareSession2::ConstructL(TDmDomainId aDomainId)
+ {
+ User::LeaveIfError(iSsmStateAwareSession.Connect(aDomainId));
+ iDeferNotification = new (ELeave) CSsmDeferralMonitor(iSsmStateAwareSession, *this);
+
+ }
+/**
+Destructor.
+Cleanup the internal CSsmDeferralMonitor active object.
+*/
+EXPORT_C CSsmStateAwareSession2::~CSsmStateAwareSession2()
+ {
+ Cancel();
+ delete iDeferNotification;
+ iSsmStateAwareSession.Close();
+ }
+
+/**
+ Gets the TSsmState state.
+ */
+EXPORT_C TSsmState CSsmStateAwareSession2::GetState()
+ {
+ return iSsmStateAwareSession.State();
+ }
+
+/**
+ Use to get a notification when the System State changes.
+ */
+EXPORT_C void CSsmStateAwareSession2::RequestStateNotification()
+ {
+ __ASSERT_ALWAYS(!IsActive(), User::Panic(KPanicSsmCmn, ECmnErrRqstStateNotif));
+ iSsmStateAwareSession.RequestStateNotification(iStatus);
+ SetActive();
+ }
+
+/**
+ Cancels an outstanding RequestStateNotification operation.
+ */
+EXPORT_C void CSsmStateAwareSession2::RequestStateNotificationCancel()
+ {
+ iDeferNotification->Cancel();
+ iSsmStateAwareSession.RequestStateNotificationCancel();
+ }
+
+/**
+ Acknowledges the state change.
+ An application must acknowledge that it has performed all actions required by the last known state of the domain.
+ @param set aError while acknowledging.
+ */
+EXPORT_C void CSsmStateAwareSession2::AcknowledgeStateNotification(TInt aError)
+ {
+ iSsmStateAwareSession.AcknowledgeStateNotification(aError);
+ iDeferNotification->NotifyOfAcknowledgement();
+ }
+
+/**
+ Acknowledges the state change.
+ An application must acknowledge that it has performed all actions required by the last known state of the domain.
+ This function appears like an atomic function and minimize the risk for missing a state notification.
+ @param aError for aknowledging with error.
+ */
+EXPORT_C void CSsmStateAwareSession2::AcknowledgeAndRequestStateNotification(TInt aError)
+ {
+ __ASSERT_ALWAYS(!IsActive(), User::Panic(KPanicSsmCmn, ECmnErrAcknldgRqstStateNotif));
+ iSsmStateAwareSession.AcknowledgeAndRequestStateNotification(aError,iStatus);
+ iDeferNotification->NotifyOfAcknowledgement();
+ SetActive();
+ }
+
+/**
+ Handles the client deferral error.
+ @param aError Error code to handle
+ */
+TInt CSsmStateAwareSession2::HandleDeferralError(TInt aError)
+ {
+ return (iSubscriber->HandleDeferralError(aError));
+ }
+
+/**
+ Handle completion of request notifications, begins deferrals.
+@note Clients should not need to override this, they
+will be notified of events via interface HandleTransition().
+ */
+void CSsmStateAwareSession2::RunL()
+ {
+ iDeferNotification->DeferNotification();
+ iSubscriber->HandleTransition(iStatus.Int());
+ }
+
+/**
+Cancels an outstanding notification request.
+Any outstanding notification request completes with KErrCancel.
+*/
+void CSsmStateAwareSession2::DoCancel()
+ {
+ iDeferNotification->Cancel();
+ iSsmStateAwareSession.RequestStateNotificationCancel();
+ }
+
+#else
+EXPORT_C CSsmStateAwareSession2* CSsmStateAwareSession2::NewL(TDmDomainId /*aDomainId*/, MStateChangeNotificationSubscriber2& /*aSubscriber*/)
+ {
+ //This functionality is not supported , so returning NULL.
+ return NULL;
+ }
+
+//All the below functionality will not be provided.
+
+EXPORT_C CSsmStateAwareSession2::~CSsmStateAwareSession2()
+ {
+ }
+
+EXPORT_C TSsmState CSsmStateAwareSession2::GetState()
+ {
+ //returning dummyState to get rid of compiler warning.
+ TSsmState dummyState;
+ return dummyState;
+ }
+
+EXPORT_C void CSsmStateAwareSession2::RequestStateNotification()
+ {
+ }
+
+EXPORT_C void CSsmStateAwareSession2::RequestStateNotificationCancel()
+ {
+ }
+
+EXPORT_C void CSsmStateAwareSession2::AcknowledgeStateNotification(TInt /*aError*/)
+ {
+ }
+
+EXPORT_C void CSsmStateAwareSession2::AcknowledgeAndRequestStateNotification(TInt /*aError*/)
+ {
+ }
+
+void CSsmStateAwareSession2::RunL()
+ {
+ }
+
+void CSsmStateAwareSession2::DoCancel()
+ {
+ }
+
+TInt CSsmStateAwareSession2::HandleDeferralError(TInt aError)
+ {
+ return aError;
+ }
+
+#endif
--- a/sysstatemgmt/systemstatemgr/cmn/src/ssmstatemonitor.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/cmn/src/ssmstatemonitor.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -110,3 +110,81 @@
{
return iState;
}
+
+
+CSsmDeferralMonitor::CSsmDeferralMonitor(RSsmStateAwareSession& aStateAwareSession, CSsmStateAwareSession2& aOwnerActiveObject)
+ : CActive(CActive::EPriorityHigh), iSsmStateAwareSession(aStateAwareSession), iOwnerActiveObject(aOwnerActiveObject), iCeaseDeferral(EFalse)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CSsmDeferralMonitor::~CSsmDeferralMonitor()
+ {
+ Cancel();
+ }
+
+/**
+ * Defers the Acknowledgement.
+ */
+void CSsmDeferralMonitor::DeferNotification()
+ {
+ __ASSERT_ALWAYS(!IsActive(), User::Panic(KPanicSsmCmn, ECmnErrDeferNotif));
+ iSsmStateAwareSession.DeferAcknowledgement(iStatus);
+ SetActive();
+ }
+
+/**
+Informs the object that the state transition has
+been _successfully_ acknowledged
+*/
+void CSsmDeferralMonitor::NotifyOfAcknowledgement()
+ {
+ if (IsActive())
+ {
+ iCeaseDeferral = ETrue;
+ }
+ }
+
+void CSsmDeferralMonitor::RunL()
+ {
+ const TInt error = iStatus.Int();
+ TBool ceaseDeferral = iCeaseDeferral;
+ iCeaseDeferral = EFalse;
+ // We are leaving with error after resetting iCeaseDeferral. This is because
+ // we might again RequestStateNotification() in HandleDeferralError(), in which case
+ // we need to reset iCeaseDeferral to EFalse so that deferral may happen again.
+ User::LeaveIfError(error);
+
+ if(!ceaseDeferral)
+ {
+ DeferNotification();
+ }
+ else
+ {
+ // At this point we know error == KErrNone
+ // However, we return the error code KErrCompletion, as this
+ // is what would have happened, had the acknowledgment come in
+ // a little earlier,
+ // whilst the deferral was still outstanding on the server.
+ User::Leave(KErrCompletion);
+ }
+ }
+
+/**
+ Handle errors thrown from RunL() - call HandleDeferralErrror()
+*/
+TInt CSsmDeferralMonitor::RunError(TInt aError)
+ {
+ DEBUGPRINT2A("CSsmDeferralMonitor::RunError: %d", aError);
+ return iOwnerActiveObject.HandleDeferralError(aError);
+ }
+
+/**
+ * Cancels the outstanding deferral request.
+ */
+void CSsmDeferralMonitor::DoCancel()
+ {
+ iSsmStateAwareSession.CancelDeferral();
+ }
+
+
--- a/sysstatemgmt/systemstatemgr/dompolicy/src/domainpolicy2.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/dompolicy/src/domainpolicy2.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2005-2010 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"
@@ -15,6 +15,9 @@
#include "ssmdomaindefs.h"
#include "ssmsubstates.hrh"
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#include "ssmstates.hrh"
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
#ifdef __WINS__
const TInt KStateTransitionTimeout = 30000000; /* 30 seconds */
@@ -22,6 +25,10 @@
const TInt KStateTransitionTimeout = 10000000; /* 10 seconds */
#endif
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+const TInt KStateDeferredLimit = 1; /* 1 time */
+const TInt KMemberTimeout = 5; /* 5msec */
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
/*
Domain specification and policy for the startup domain hierarchy
*/
@@ -38,10 +45,22 @@
{ KSM2UiServicesDomain3, KSM2AppServicesDomain4, _INIT_SECURITY_POLICY_PASS, ESsmStartupSubStateUndefined, KStateTransitionTimeout },
{ KSM2UiApplicationDomain3, KSM2UiServicesDomain3, _INIT_SECURITY_POLICY_PASS, ESsmStartupSubStateUndefined, KStateTransitionTimeout },
// end of array marker
- { KDmIdNone, KDmIdNone, _INIT_SECURITY_POLICY_PASS, 0, 0 }
+ TDM_DOMAIN_SPEC_END
};
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+/**
+ * Note that the transition monitor feature is enabled for states added to StateSpecification array only.
+ */
+static const SDmStateSpecV1 StateSpecification[]=
+ {
+ {(ESsmShutdown << 16 | ESsmShutdownSubStateCritical), KMemberTimeout, KStateDeferredLimit, ETransitionFailureUsePolicyFromOrdinal3},
+ {(ESsmShutdown << 16 | ESsmShutdownSubStateNonCritical), KMemberTimeout, KStateDeferredLimit, ETransitionFailureUsePolicyFromOrdinal3}
+
+ };
+
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
/*
Note that the _INIT_SECURITY_POLICY_C1(ECapabilityWriteDeviceData) is not used for the root domain, since this refers to the capabilities of
the SSA components connecting to the Start-up Domain Hierarchy. No capabilities are required by SSA components to attach to the Start-up Domain Hierarchy.
@@ -100,3 +119,43 @@
return KErrNone;
}
+/**
+Retrieves the state specification array.
+The domain manager retrieves the StateSpecification array to read the state for which the transition
+monitoring feature has to be enabled.
+This should be present in the oridinal4 of the domainpolicy def file.
+
+@param aPtr Will have the state specification structure used in the array .
+@param aNumElements Will hold the number of elements in the array.
+
+@return will return the version of the domain policy if the feature is enabled or else returns KErrNotSupported.
+ */
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+EXPORT_C TInt DmPolicy::GetStateSpec(TAny*& aPtr, TUint& aNumElements)
+ {
+ TInt version = KErrNotSupported;
+ aPtr = (TAny*) StateSpecification;
+ aNumElements = sizeof(StateSpecification)/sizeof(SDmStateSpecV1);
+ version = KSDmStateSpecV1;
+ return version;
+ }
+#else
+EXPORT_C TInt DmPolicy::GetStateSpec(TAny*& aPtr, TUint& aNumElements)
+ {
+ aPtr = NULL;
+ aNumElements = 0;
+ return KErrNotSupported;
+ }
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+
+/**
+Defines the function type for a static function that is implemented by
+a device's domain policy DLL at ordinal 5.
+The domain manager uses this function to release the state specification returned by ordinal 4.
+The implementation may be empty and simply return if no release action needs
+to be taken.
+ */
+EXPORT_C void DmPolicy::ReleaseStateSpec(TAny* /*aStateSpec*/)
+ {
+ }
+
--- a/sysstatemgmt/systemstatemgr/inc/ssmstateawaresession.h Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/inc/ssmstateawaresession.h Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -18,10 +18,13 @@
#include <e32base.h>
#include <domaindefs.h>
+#include <domainmember.h>
#include <ssm/ssmstate.h>
class CSsmStateMonitor;
+class CSsmDeferralMonitor;
+
/**
Read-only client interface to receive notifications when the
@@ -44,6 +47,9 @@
IMPORT_C void RequestStateNotificationCancel();
IMPORT_C void AcknowledgeStateNotification(TInt aError);
IMPORT_C void AcknowledgeAndRequestStateNotification(TInt aError, TRequestStatus& aStatus);
+ IMPORT_C void DeferAcknowledgement(TRequestStatus& aStatus);
+ IMPORT_C void CancelDeferral();
+
private:
RSsmStateAwareSession(const RSsmStateAwareSession& aState);
@@ -103,5 +109,76 @@
CSsmStateMonitor* iMonitor;
TInt iSpare[4];
};
+
+
+/**
+Interface to implement for clients that want to use the @c CExtendedSsmStateAwareSession
+utility class.
+
+@publishedPartner
+@released
+*/
+class MStateChangeNotificationSubscriber2
+ {
+public:
+ /*HandleTransition() will be called when the transition notification
+ comes in. Thereafter, the active object will contineouslly defer the transition.
+
+ The implementation of this function should be used first to call
+ RequestTransitionNotification() again if required, and then to initiate the
+ response to the transition. It should be kept as quick as possible.
+
+ Once the Domain Member's transition operations are complete, it should call
+ AcknowledgeLastState() on this active object, to indicate it is ready to be
+ transitioned*/
+
+ virtual void HandleTransition(TInt aError) = 0;
+
+ virtual TInt HandleDeferralError(TInt aError) = 0;
+ };
+
+/**
+This class automatically deferrs transitions as long as possible after the original notification
+is received.
+
+To make use of this class, one has to implement the implement the HandleTransition()
+in MStateChangeNotificationSubscriber2. HandleTransition() will be called when the transition notification
+comes in. Thereafter, the active object will continually defer the transition.
+
+This object is intended to simplify the handling of notifications and
+deferrals. The member must ensure that other active objects do not block or
+have long-running RunL()s; this is to ensure that the Active Scheduler will
+remain responsive to the completion of deadline deferrals.
+
+The capabilities needed are the same as those needed for RDmDomain::DeferAcknowledgement()
+@capability WriteDeviceData
+@capability ProtServ
+@see
+*/
+NONSHARABLE_CLASS(CSsmStateAwareSession2):public CActive
+ {
+public:
+ IMPORT_C static CSsmStateAwareSession2* NewL(TDmDomainId aDomainId, MStateChangeNotificationSubscriber2& aSubscriber );
+ IMPORT_C ~CSsmStateAwareSession2();
+ IMPORT_C void RequestStateNotification();
+ IMPORT_C void RequestStateNotificationCancel();
+ IMPORT_C void AcknowledgeStateNotification(TInt aError);
+ IMPORT_C void AcknowledgeAndRequestStateNotification(TInt aError);
+ IMPORT_C TSsmState GetState();
+ TInt HandleDeferralError(TInt aError);
+
+private:
+ CSsmStateAwareSession2(MStateChangeNotificationSubscriber2& aSubscriber);
+ void RunL();
+ void DoCancel();
+ void ConstructL(TDmDomainId aDomainId);
+
+
+private:
+ RSsmStateAwareSession iSsmStateAwareSession;
+ //For deferring the notification.
+ CSsmDeferralMonitor* iDeferNotification;
+ MStateChangeNotificationSubscriber2* iSubscriber;
+ };
#endif
--- a/sysstatemgmt/systemstatemgr/ss/group/ssmstartsafe.mmp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/ss/group/ssmstartsafe.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -38,7 +38,7 @@
source fireandforget.cpp
source activewaiter.cpp
-library euser.lib ssmcmn.lib estor.lib
+library euser.lib ssmcmn.lib estor.lib efsrv.lib
--- a/sysstatemgmt/systemstatemgr/ss/src/fireandforget.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/ss/src/fireandforget.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -17,6 +17,8 @@
#include "timeoutwaiter.h"
#include "ssmdebug.h"
+#include <f32file.h>
+
_LIT(KApStartDLL, "apstart.dll");
_LIT( KSysMonProxyDLL, "loadsysmon.dll" );
typedef CApaStarter* (*TFuncNewL)( void );
@@ -75,7 +77,7 @@
TFullName searchTerm(iStartupProperties->FileName());
_LIT(KSearchAny, "*");
searchTerm += KSearchAny;
- TFindProcess find(searchTerm);
+ TFindProcess find(TParsePtrC(searchTerm).NameAndExt());
TFullName name;
err = find.Next(name);
if(err == KErrNone)
--- a/sysstatemgmt/systemstatemgr/ss/src/rvobserver.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/ss/src/rvobserver.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -20,7 +20,8 @@
#include "rvobservernotification.h"
#include "ssconst.h"
#include "ssmdebug.h"
-
+
+#include <f32file.h>
/**
We are either starting for the first time, or an app or process has rendezvouzed.
If the latter, check if it has done so without error and behave as appropriate.
@@ -187,7 +188,7 @@
TFullName searchTerm(iStartupProperties->FileName());
_LIT(KSearchAny, "*");
searchTerm += KSearchAny;
- TFindProcess find(searchTerm);
+ TFindProcess find(TParsePtrC(searchTerm).NameAndExt());
TFullName name;
err = find.Next(name);
if(err == KErrNone)
--- a/sysstatemgmt/systemstatemgr/ssm/src/main.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/ssm/src/main.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -37,10 +37,12 @@
{
PanicNow(KPanicSysStateMgr, EAddDomainHierarchyError);
}
-
+ RLibrary lib;
+ lib.Load(_L("libc"));
+ CleanupClosePushL(lib);
CSsmServer* server = CSsmServer::NewLC(ESsmStartup);
sched->Start();
-
+ CleanupStack::PopAndDestroy(&lib);
CleanupStack::PopAndDestroy(server);
CleanupStack::PopAndDestroy(sched);
}
--- a/sysstatemgmt/systemstatemgr/test/tcmn/group/bld.inf Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -34,6 +34,12 @@
PRJ_TESTMMPFILES
tcmn_server.mmp
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+tcmn_transitionmonitor_server.mmp
+#endif // TEST_SSM_GRACEFUL_SHUTDOWN
+#endif // SYMBIAN_INCLUDE_APP_CENTRIC
+
//Define TEST_SSM_GRACEFUL_OFFLINE only when patchable constant KSsmGracefulOffline is enabled
#ifdef TEST_SSM_GRACEFUL_OFFLINE
tcmn_gracefulnotify_server.mmp
@@ -53,6 +59,28 @@
../scripts/ssmatest_cmn_swpvalue.script z:/ssmatest/ssmatest_cmn_swpvalue.script
../scripts/ssmatest_cmn_systemwideproperty.script z:/ssmatest/ssmatest_cmn_systemwideproperty.script
../scripts/ssmatest_cmn_stateawaresession.script z:/ssmatest/ssmatest_cmn_stateawaresession.script
+
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+../scripts/ssmatest_cmn_canceldeferral.script z:/ssmatest/ssmatest_cmn_canceldeferral.script
+../scripts/ssmatest_cmn_deferackn.script z:/ssmatest/ssmatest_cmn_deferackn.script
+../scripts/ssmatest_cmn_noackn.script z:/ssmatest/ssmatest_cmn_noackn.script
+../scripts/ssmatest_cmn_acklaststate.script z:/ssmatest/ssmatest_cmn_acklaststate.script
+../scripts/ssmatest_cmn_maxdefer.script z:/ssmatest/ssmatest_cmn_maxdefer.script
+../scripts/ssmatest_cmn_deferwocap.script z:/ssmatest/ssmatest_cmn_deferwocap.script
+../scripts/ssmatest_cmn_defertwice.script z:/ssmatest/ssmatest_cmn_defertwice.script
+../scripts/ssmatest_cmn_defertooearly.script z:/ssmatest/ssmatest_cmn_defertooearly.script
+../scripts/ssmatest_cmn_deferautomatic.script z:/ssmatest/ssmatest_cmn_deferautomatic.script
+../scripts/ssmatest_cmn_deferautomaticwocap.script z:/ssmatest/ssmatest_cmn_deferautomaticwocap.script
+../scripts/ssmatest_cmn_maxautomaticdefer.script z:/ssmatest/ssmatest_cmn_maxautomaticdefer.script
+../scripts/ssmatest_cmn_deferackn_anysubstate.script z:/ssmatest/ssmatest_cmn_deferackn_anysubstate.script
+../scripts/ssmatest_cmn_deferackn_failstate.script z:/ssmatest/ssmatest_cmn_deferackn_failstate.script
+../scripts/ssmatest_cmn_requestandcancelstatenotification.script z:/ssmatest/ssmatest_cmn_requestandcancelstatenotification.script
+
+../testdata/ssmatest_cmn_transitionmonitor.ini z:/ssmatest/ssmatest_cmn_transitionmonitor.ini
+#endif // TEST_SSM_GRACEFUL_SHUTDOWN
+#endif // SYMBIAN_INCLUDE_APP_CENTRIC
+
#ifdef TEST_SSM_GRACEFUL_OFFLINE
../scripts/ssmatest_cmn_gracefulofflinestatenotify.script z:/ssmatest/ssmatest_cmn_gracefulofflinestatenotify.script
../testdata/ssmatest_cmn_gracefulofflinestatenotify.ini z:/ssmatest/ssmatest_cmn_gracefulofflinestatenotify.ini
--- a/sysstatemgmt/systemstatemgr/test/tcmn/group/ssmatest_cmn.iby Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/group/ssmatest_cmn.iby Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -22,9 +22,15 @@
// test server
data=ABI_DIR\DEBUG_DIR\tcmn_server.exe sys\bin\tcmn_server.exe
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+data=ABI_DIR\DEBUG_DIR\tcmn_transitionmonitor.exe sys\bin\tcmn_transitionmonitor.exe
+#endif // TEST_SSM_GRACEFUL_SHUTDOWN
+#endif // SYMBIAN_INCLUDE_APP_CENTRIC
+
#ifdef TEST_SSM_GRACEFUL_OFFLINE
data=ABI_DIR\DEBUG_DIR\tcmn_gracefulnotify.exe sys\bin\tcmn_gracefulnotify.exe
-#endif
+#endif // TEST_SSM_GRACEFUL_OFFLINE
// script files
data=DATAZ_\ssmatest\ssmatest_cmn_run.bat \ssmatest_cmn_run.bat
@@ -38,6 +44,27 @@
data=DATAZ_\ssmatest\ssmatest_cmn_gracefulofflinestatenotify.ini \ssmatest\ssmatest_cmn_gracefulofflinestatenotify.ini
// rsc file
data=EPOCROOT##epoc32\data\z\private\2000d75b\startup\0\tgracefulofflinepatch.rsc private\2000d75b\startup\0\tgracefulofflinepatch.rsc
-#endif
+#endif // TEST_SSM_GRACEFUL_OFFLINE
-#endif
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+data=DATAZ_\ssmatest\ssmatest_cmn_canceldeferral.script \ssmatest\ssmatest_cmn_canceldeferral.script
+data=DATAZ_\ssmatest\ssmatest_cmn_deferackn.script \ssmatest\ssmatest_cmn_deferackn.script
+data=DATAZ_\ssmatest\ssmatest_cmn_noackn.script \ssmatest\ssmatest_cmn_noackn.script
+data=DATAZ_\ssmatest\ssmatest_cmn_acklaststate.script \ssmatest\ssmatest_cmn_acklaststate.script
+data=DATAZ_\ssmatest\ssmatest_cmn_maxdefer.script \ssmatest\ssmatest_cmn_maxdefer.script
+data=DATAZ_\ssmatest\ssmatest_cmn_deferwocap.script \ssmatest\ssmatest_cmn_deferwocap.script
+data=DATAZ_\ssmatest\ssmatest_cmn_defertwice.script \ssmatest\ssmatest_cmn_defertwice.script
+data=DATAZ_\ssmatest\ssmatest_cmn_defertooearly.script \ssmatest\ssmatest_cmn_defertooearly.script
+data=DATAZ_\ssmatest\ssmatest_cmn_deferautomatic.script \ssmatest\ssmatest_cmn_deferautomatic.script
+data=DATAZ_\ssmatest\ssmatest_cmn_deferautomaticwocap.script \ssmatest\ssmatest_cmn_deferautomaticwocap.script
+data=DATAZ_\ssmatest\ssmatest_cmn_maxautomaticdefer.script \ssmatest\ssmatest_cmn_maxautomaticdefer.script
+data=DATAZ_\ssmatest\ssmatest_cmn_deferackn_anysubstate.script \ssmatest\ssmatest_cmn_deferackn_anysubstate.script
+data=DATAZ_\ssmatest\ssmatest_cmn_deferackn_failstate.script \ssmatest\ssmatest_cmn_deferackn_failstate.script
+data=DATAZ_\ssmatest\ssmatest_cmn_requestandcancelstatenotification.script \ssmatest\ssmatest_cmn_requestandcancelstatenotification.script
+
+data=DATAZ_\ssmatest\ssmatest_cmn_transitionmonitor.ini \ssmatest\ssmatest_cmn_transitionmonitor.ini
+#endif // TEST_SSM_GRACEFUL_SHUTDOWN
+#endif // SYMBIAN_INCLUDE_APP_CENTRIC
+
+#endif // __SSMATEST_CMN_IBY__
--- a/sysstatemgmt/systemstatemgr/test/tcmn/group/tcmn_server.mmp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/group/tcmn_server.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -39,6 +39,12 @@
USERINCLUDE ../../../localinc
USERINCLUDE ../../../cmd/inc
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+USERINCLUDE ../../../../inc
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
+
SOURCEPATH ../../../cmn/src
SOURCE ssmstatemanager.cpp
@@ -59,6 +65,12 @@
SOURCE tcmn_step_stateawaresession.cpp
SOURCE tcmn_step_systemwideproperty.cpp
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+SOURCE t_stateawaresession2.cpp
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+
SOURCEPATH ../../testutils/src
SOURCE ssmatest_utils.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/group/tcmn_transitionmonitor_server.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,55 @@
+//tcmn_transitionmonitor_server.mmp
+
+// Copyright (c) 2010 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: Server for handling graceful notification incase of state change
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+TARGET tcmn_transitionmonitor.exe
+TARGETTYPE exe
+TARGETPATH /sys/bin
+
+UID 0x1000007A 0x20031E47
+VENDORID 0x70000001
+
+CAPABILITY ProtServ WriteDeviceData PowerMgmt
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+// testcode
+USERINCLUDE ../inc
+USERINCLUDE ../../../../inc
+
+SOURCEPATH ../src
+SOURCE tcmn_transitionmonitor_server.cpp
+SOURCE t_stateawaresessionwrapper.cpp
+SOURCE t_ssmstatemanager.cpp
+SOURCE t_stateawaresession2.cpp
+
+LIBRARY ssmcmn.lib
+LIBRARY euser.lib
+LIBRARY efsrv.lib
+LIBRARY ssmcmd.lib
+LIBRARY testexecuteutils.lib
+LIBRARY bafl.lib
+LIBRARY centralrepository.lib
+
+SMPSAFE
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/inc/t_stateawaresession2.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,75 @@
+// Copyright (c) 2010 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: Wrapper for Testing CStateAwareSession2 class.
+//
+//
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#ifndef __T_STATEAWARESESSIONWRAPPER2_H__
+#define __T_STATEAWARESESSIONWRAPPER2_H__
+
+#include <ssm/ssmstatemanager.h>
+#include <ssm/ssmstateawaresession.h>
+
+#include <test/testexecutestepbase.h>
+#include <test/datawrapper.h>
+
+// This structure is used to hold data read from the test ini file for CTestCStateAwareSession
+struct TIniData3
+ {
+ TBool iAcknowledge;
+ TInt iAsyncIndex;
+ TIniData3();
+ };
+
+class CTestCStateAwareSession : public CDataWrapper, public MStateChangeNotificationSubscriber2
+ {
+public:
+ CTestCStateAwareSession();
+ ~CTestCStateAwareSession();
+
+ TBool DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt /*aAsyncErrorIndex*/);
+
+ TAny* GetObject();
+ void SetObjectL(TAny* aAny);
+ void DisownObjectL();
+
+ void DoCmdNew();
+ void DoCmdDestructor();
+ void DoCmdRequestStateNotification();
+ void DoCmdAcknowledgeStateNotification(const TDesC& aSection);
+ void DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection);
+ void DoCmdRequestStateNotificationCancel();
+ void DoCmdReturnCount(const TDesC& aSection);
+ void DoCmdReadIniData(const TDesC& aSection);
+
+ //helper
+ void DoCleanup();
+
+ //from MStateChangeNotificationSubscriber2
+ void HandleTransition(TInt aError);
+ TInt HandleDeferralError(TInt aError);
+
+private:
+ CSsmStateAwareSession2* iSsmStateAwareSession;
+ TIniData3 iIniData;
+ };
+
+#endif // __T_STATEAWARESESSIONWRAPPER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/inc/t_stateawaresessionwrapper.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,142 @@
+// Copyright (c) 2010 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: Wrapper for testing RStateAwareSession class.
+//
+//
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#ifndef __T_STATEAWARESESSIONWRAPPER_H__
+#define __T_STATEAWARESESSIONWRAPPER_H__
+
+#include <ssm/ssmstatemanager.h>
+#include <ssm/ssmstateawaresession.h>
+
+#include <test/testexecutestepbase.h>
+#include <test/datawrapper.h>
+
+// This structure is used to hold data read from the test ini file for CTestRStateAwareSession1
+struct TIniData1
+ {
+ TBool iCancelDeferral;
+ TBool iAckLastState;
+ TBool iDeferTwice;
+ TInt iCount;
+ TBool iAcknowledge;
+ TIniData1();
+ };
+
+// This structure is used to hold data read from the test ini file for CTestRStateAwareSession2
+struct TIniData2
+ {
+ TInt iCount;
+ TBool iAcknowledge;
+ TIniData2();
+ };
+
+//Client 1
+class CTestRStateAwareSession1 : public CDataWrapper
+ {
+public:
+ static CTestRStateAwareSession1* NewL();
+ ~CTestRStateAwareSession1();
+
+ TBool DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex);
+
+ TAny* GetObject();
+ void SetObjectL(TAny* aAny);
+ void DisownObjectL();
+
+
+ void DoCmdNew();
+ void DoCmdDestructor();
+ void DoCmdConnect(const TDesC& aSection);
+ void DoCmdClose();
+ void DoCmdRequestStateNotification(const TInt aAsyncErrorIndex);
+ void DoCmdAcknowledgeStateNotification(const TDesC& aSection);
+ void DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection, const TInt aAsyncErrorIndex);
+ void DoCmdRequestStateNotificationCancel();
+ void DoCmdDeferAcknowledgement(const TInt aAsyncErrorIndex);
+ void DoCmdReturnCount(const TDesC& aSection);
+ void DoCmdReadIniData(const TDesC& aSection);
+
+ //helper
+ void DoCleanup();
+
+protected:
+ CTestRStateAwareSession1();
+ void ConstructL();
+
+ void RunL(CActive* aActive, TInt aIndex);
+ void DoCancel(CActive* aActive, TInt aIndex);
+
+
+private:
+ RSsmStateAwareSession* iSsmStateAwareSession;
+ CActiveCallback* iActiveNotifyOnChange;
+ CActiveCallback* iActiveNotifyOnChange2;
+ // The iCount variable is used to store the no. of deferral calls made.
+ // It is incremented each time a deferral call is made.
+ TInt iCount;
+ TIniData1 iIniData;
+ };
+
+//Client 2
+class CTestRStateAwareSession2 : public CDataWrapper
+ {
+public:
+ static CTestRStateAwareSession2* NewL();
+ ~CTestRStateAwareSession2();
+
+ TBool DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex);
+
+ TAny* GetObject();
+ void SetObjectL(TAny* aAny);
+ void DisownObjectL();
+
+
+ void DoCmdNew();
+ void DoCmdDestructor();
+ void DoCmdConnect(const TDesC& aSection);
+ void DoCmdClose();
+ void DoCmdRequestStateNotification(const TInt aAsyncErrorIndex);
+ void DoCmdAcknowledgeStateNotification(const TDesC& aSection);
+ void DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection, const TInt aAsyncErrorIndex);
+ void DoCmdRequestStateNotificationCancel();
+ void DoCmdReadIniData(const TDesC& aSection);
+
+ //helper
+ void DoCleanup();
+
+protected:
+ CTestRStateAwareSession2();
+ void ConstructL();
+
+ void RunL(CActive* aActive, TInt aIndex);
+ void DoCancel(CActive* aActive, TInt aIndex);
+
+
+private:
+ RSsmStateAwareSession* iSsmStateAwareSession;
+ CActiveCallback* iActiveNotifyOnChange;
+ TInt iCount;
+ TIniData2 iIniData;
+ };
+
+#endif // __T_STATEAWARESESSIONWRAPPER_H__
--- a/sysstatemgmt/systemstatemgr/test/tcmn/inc/tcmn_step_stateawaresession.h Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/inc/tcmn_step_stateawaresession.h Fri Oct 08 14:33:25 2010 +0300
@@ -47,6 +47,11 @@
void doTestRConnectL();
void StartThread(TInt aOption);
void doTestCSsmStateAwareSessionL();
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+ void doTestCSsmDeferralMonitorL();
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
RArray<TSsmState> iStateChanges;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/inc/tcmn_transitionmonitor_server.h Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,50 @@
+// Copyright (c) 2010 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: Server for handling graceful notification incase of state change
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+#ifndef __TCMN_TRANSITIONMONITOR_SERVER_H__
+#define __TCMN_TRANSITIONMONITOR_SERVER_H__
+
+#include <test/testblockcontroller.h>
+#include <test/testserver2.h>
+#include <test/testexecuteserverbase.h>
+
+class CAwareSessionTestBlock : public CTestBlockController
+ {
+public:
+ CAwareSessionTestBlock() : CTestBlockController() {}
+ ~CAwareSessionTestBlock() {}
+
+ CDataWrapper* CreateDataL(const TDesC& aData);
+ };
+
+
+class CAwareSessionTestServer : public CTestServer2
+ {
+public:
+ CAwareSessionTestServer() {}
+ ~CAwareSessionTestServer() {}
+
+ static CAwareSessionTestServer* NewL();
+ CTestBlockController* CreateTestBlock();
+ };
+
+#endif //__TCMN_TRANSITIONMONITOR_SERVER_H__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_acklaststate.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,57 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0016
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test whether acknowledging state change notification without waiting for the deferral to complete succeeds.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0016
+//! @SYMTestCaseID DVS-SSMA-CMN-0016
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers acknowledgement first after receiving shutdown state change notificcation and acknowledges immediately
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown
+/! 3.Defer acknowledgement upon receiving state change notification to shutdown state
+//! 4.Acknowledge state change notification without waiting for the deferral to complete
+//! @SYMTestExpectedResults The call to defer completes with KErrCompletion
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND RSsmStateAwareSession1 ReadIniData AckLastState
+ COMMAND !AsyncError=-17 RSsmStateAwareSession1 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionCriticalSubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession1 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0016
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_canceldeferral.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,58 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0010
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test if cancelling a deferral after submitting a deferral call indeed cancels the deferral.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0010
+//! @SYMTestCaseID DVS-SSMA-CMN-0010
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers acknowledgement to the shutdown state change notification and then cancels the deferral
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown
+//! 3.Defer acknowledgement upon receiving state change notification to shutdown state
+//! 4.Cancel the deferral and acknowledge state change notification
+//! @SYMTestExpectedResults The call to defer completes with KErrCancel
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND RSsmStateAwareSession1 ReadIniData CancelDeferral
+ COMMAND !AsyncError=-3 RSsmStateAwareSession1 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionCriticalSubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 ReturnCount CancelDeferral
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession1 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0010
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_deferackn.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,57 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0009
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test if the acknowledgement deferral functionality of a client works correctly.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0009
+//! @SYMTestCaseID DVS-SSMA-CMN-0009
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers acknowledgement to shutdown state change once and then acknowledges
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown
+//! 3.Defer acknowledgement upon receiving state change notification to shutdown state
+//! 4.Acknowledge once the deferral has completed
+//! @SYMTestExpectedResults The call to defer completes successfully
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND RSsmStateAwareSession1 ReadIniData DeferAckn
+ COMMAND RSsmStateAwareSession1 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionCriticalSubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession1 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0009
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_deferackn_anysubstate.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,55 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0018
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test whether deferring acknowledgement to a state not supporting transition monitoring fails with appropriate error.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0018
+//! @SYMTestCaseID DVS-SSMA-CMN-0018
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers acknowledgement to KSsmAnySubState of Shutdown state.
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown, KSsmAnySubState
+//! 3.Defer acknowledgement upon receiving state change notification to shutdown state
+//! @SYMTestExpectedResults The call to defer completes with KErrNotSupported
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession2 RSsmStateAwareSession2
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession2 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession2 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND !AsyncError=-5 RSsmStateAwareSession2 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionAnySubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession2 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession2 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0018
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_deferackn_failstate.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,55 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0017
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in fail state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test whether deferring acknowledgement to a state not supporting transition monitoring fails with appropriate error.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0017
+//! @SYMTestCaseID DVS-SSMA-CMN-0017
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers acknowledgement to Fail state.
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for fail state change notification
+//! 2.Request state change to ESsmFail
+//! 3.Defer acknowledgement upon receiving state change notification to fail state
+//! @SYMTestExpectedResults The call to defer completes with KErrNotSupported
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession2 RSsmStateAwareSession2
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession2 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession2 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND !AsyncError=-5 RSsmStateAwareSession2 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition FailTransitionAnySubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession2 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession2 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0017
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_deferautomatic.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,56 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0020
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test if the client keeps deferring acknowledgement automatically
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0020
+//! @SYMTestCaseID DVS-SSMA-CMN-0020
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which automatically defers acknowledgement to shutdown state change
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown - KSsmAnySubState
+//! 3.Upon receiving state change notification to Shutdown - KSsmAnySubState, acknowledge and request state change notification again
+//! 4.Upon receiving state change notification to Shutdown Critical substate, the acknowledgement is deferred automatically
+//! 5.Acknowledge the state change and check whether the final return code is KErrCompletion
+//! @SYMTestExpectedResults The test completes with error code, KErrCompletion
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT CSsmStateAwareSession2 CSsmStateAwareSession2
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND CSsmStateAwareSession2 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateManager Connect
+ COMMAND CSsmStateAwareSession2 ReadIniData DeferAutomatic
+ COMMAND !AsyncError=-17 CSsmStateAwareSession2 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionAnySubState
+ OUTSTANDING
+ COMMAND RSsmStateManager Close
+ COMMAND CSsmStateAwareSession2 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0020
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_deferautomaticwocap.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,58 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0019
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test if the client keeps deferring acknowledgement automatically
+//! @SYMScriptCreationDate 18/08/2010
+
+RUN_PROGRAM -1 setcap tcmn_transitionmonitor.exe 00004 tcmn_transitionmonitor_wocap.exe
+LOAD_SUITE tcmn_transitionmonitor_wocap
+
+START_TESTCASE DVS-SSMA-CMN-0019
+//! @SYMTestCaseID DVS-SSMA-CMN-0019
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server without appropriate capabilities which automatically defers acknowledgement to shutdown state change
+//! @SYMTestActions 1.Create a thread without WriteDeviceData and ProtServ capabilities
+//! 2.Connect to the server with a domain Id and request for shutdown state change notification
+//! 3.Request state change to ESsmShutdown - KSsmAnySubState
+//! 4.Upon receiving state change notification to Shutdown KSsmAnySubState, acknowledge and request state change notification again
+//! 5.Upon receiving state change notification to Shutdown Critical substate, the acknowledgement is deferred automatically
+//! 6.Acknowledge the state change and check whether the final return code is KErrPermissionDenied
+//! @SYMTestExpectedResults The call to defer completes with KErrPermissionDenied
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor_wocap z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT CSsmStateAwareSession2 CSsmStateAwareSession2
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND CSsmStateAwareSession2 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateManager Connect
+ COMMAND CSsmStateAwareSession2 ReadIniData DeferAutomatic
+ COMMAND !AsyncError=-46 CSsmStateAwareSession2 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionAnySubState
+ OUTSTANDING
+ COMMAND RSsmStateManager Close
+ COMMAND CSsmStateAwareSession2 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0019
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_defertooearly.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,47 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0012
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! @SYMScriptPurpose Test if deferring before receiving a state change notification returns with appropriate error.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0012
+//! @SYMTestCaseID DVS-SSMA-CMN-0012
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers acknowledgement to shutdown state change even before the state has changed
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id
+//! 2.Defer acknowledgement to shutdown state change even before the state change notification is received
+//! @SYMTestExpectedResults The call to defer returns with KErrNotReady
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateAwareSession1 ReadIniData DeferTooEarly
+ COMMAND !AsyncError=-18 RSsmStateAwareSession1 DeferAcknowledgement
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateAwareSession1 ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0012
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_defertwice.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,56 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0013
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test whether deferring ackn when a deferral was already outstanding results in an appropriate error.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0013
+//! @SYMTestCaseID DVS-SSMA-CMN-0013
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers acknowledgement twice in succession without waiting for the first defer call to complete
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown
+//! 3.Defer acknowledgement twice upon receiving the shutdown state change notification
+//! @SYMTestExpectedResults The second call to defer completes with KErrServerBusy
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND RSsmStateAwareSession1 ReadIniData DeferTwice
+ COMMAND !AsyncError=-16 RSsmStateAwareSession1 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionCriticalSubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession1 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0013
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_deferwocap.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,57 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0015
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test whether a client deferring without required capabilities results in an error
+//! @SYMScriptCreationDate 18/08/2010
+
+RUN_PROGRAM -1 setcap tcmn_transitionmonitor.exe 00004 tcmn_transitionmonitor_wocap.exe
+LOAD_SUITE tcmn_transitionmonitor_wocap
+
+START_TESTCASE DVS-SSMA-CMN-0015
+//! @SYMTestCaseID DVS-SSMA-CMN-0015
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which tries to defer state notification without appropriate capabilities
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown
+//! 3.Defer acknowledgement, upon receiving state change notification to shutdown state, without WriteDeviceData and ProtServ capabilities
+//! @SYMTestExpectedResults Request to defer acknowledgement should fail with KErrPermissionDenied
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor_wocap z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND RSsmStateAwareSession1 ReadIniData DeferWoCap
+ COMMAND !AsyncError=-46 RSsmStateAwareSession1 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionCriticalSubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession1 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0015
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_maxautomaticdefer.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,56 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0021
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test if the client keeps deferring acknowledgement automatically
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0021
+//! @SYMTestCaseID DVS-SSMA-CMN-0021
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which automatically defers acknowledgement to shutdown state change
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown - KSsmAnySubState
+//! 3.Upon receiving state change notification to Shutdown KSsmAnySubState, acknowledge and request state change notification again
+//! 4.Upon receiving state change notification to Shutdown Critical substate, the acknowledgement is deferred automatically
+//! 5.Do not acknowledge the state change, check whether the final return value is KErrNotSupported
+//! @SYMTestExpectedResults The test completes with error code, KErrNotSupported
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT CSsmStateAwareSession2 CSsmStateAwareSession2
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND CSsmStateAwareSession2 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateManager Connect
+ COMMAND CSsmStateAwareSession2 ReadIniData MaxAutomaticDefer
+ COMMAND !AsyncError=-5 CSsmStateAwareSession2 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionAnySubState
+ OUTSTANDING
+ COMMAND RSsmStateManager Close
+ COMMAND CSsmStateAwareSession2 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0021
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_maxdefer.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,57 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0014
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test whether deferring a client more than the no. of times allowed returns an appropriate error.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0014
+//! @SYMTestCaseID DVS-SSMA-CMN-0014
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which defers more than the number of times a server is allowed to defer acknowledgement
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Request state change to ESsmShutdown
+//! 3.Defer acknowledgement twice, upon receiving state change notification to shutdown state, each time waiting for the previous defer call to complete before calling again
+//! @SYMTestExpectedResults The second call to defer returns with KErrNotSupported
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND RSsmStateAwareSession1 ReadIniData MaxDefer
+ COMMAND !AsyncError=-5 RSsmStateAwareSession1 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionCriticalSubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 ReturnCount MaxDefer
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession1 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0014
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_noackn.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,64 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0011
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! Note: The system is going to be in shutdown state after executing this test and can not be restored to normal for executing other tests.
+//! So this test has to be executed separately or at the end on overnight build machines.
+//! @SYMScriptPurpose Test whether shutdown state is reached even when the state change notification is not acknowledged.
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0011
+//! @SYMTestCaseID DVS-SSMA-CMN-0011
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which never acknowledges state change notification
+//! @SYMTestActions 1.Create 2 threads and connect to the server with a domain Id and request for shutdown state change notification in both the threads
+//! 2.Request state change to ESsmShutdown
+//! 3.Defer the acknowledgement, upon receiving state change notification to shutdown state, once in the first thread and don't acknowledge when it returns.
+//! 4.Acknowledge notfification in the second thread.
+//! @SYMTestExpectedResults Shutdown continues since failure policy is ETransitionFailureContinue
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT RSsmStateAwareSession1 RSsmStateAwareSession1
+ CREATE_OBJECT RSsmStateAwareSession2 RSsmStateAwareSession2
+ CREATE_OBJECT RSsmStateManager RSsmStateManager
+ COMMAND RSsmStateAwareSession1 NewL
+ COMMAND RSsmStateAwareSession2 NewL
+ COMMAND RSsmStateManager NewL
+ COMMAND RSsmStateAwareSession1 Connect Domain
+ COMMAND RSsmStateAwareSession2 Connect Domain
+ COMMAND RSsmStateManager Connect
+ COMMAND RSsmStateAwareSession1 ReadIniData NoAckn
+ COMMAND RSsmStateAwareSession2 ReadIniData NoAckn2
+ COMMAND RSsmStateAwareSession1 RequestStateNotification
+ COMMAND RSsmStateAwareSession2 RequestStateNotification
+ COMMAND RSsmStateManager RequestStateTransition ShutdownTransitionCriticalSubState
+ OUTSTANDING
+ COMMAND RSsmStateAwareSession1 Close
+ COMMAND RSsmStateAwareSession2 Close
+ COMMAND RSsmStateManager Close
+ COMMAND RSsmStateAwareSession1 ~
+ COMMAND RSsmStateAwareSession2 ~
+ COMMAND RSsmStateManager ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0011
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_requestandcancelstatenotification.script Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,45 @@
+// Copyright (c) 2010 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: Testing for Transition Monitoring feature implemented as part of Staged Shutdown REQ for AppCentric architecture. This feature allows clients to defer acknowledgement to state change notifications during shutdown.
+//
+
+//! @file
+//! @SYMTestSuiteName DVS-SSMA-CMN-0022
+//! @SYMScriptTestEnvironment Details as in below:-
+//! 1. testexecute framework(TEF3.0).
+//! For the testing purpose define macro TEST_SSM_GRACEFUL_SHUTDOWN(For power off request feature) and SYMBIAN_INCLUDE_APP_CENTRIC(for transition monitoring feature).
+//! @SYMScriptPurpose Test if the client keeps deferring acknowledgement automatically
+//! @SYMScriptCreationDate 18/08/2010
+
+LOAD_SUITE tcmn_transitionmonitor
+
+START_TESTCASE DVS-SSMA-CMN-0022
+//! @SYMTestCaseID DVS-SSMA-CMN-0022
+//! @SYMPREQ SUB 405-5490
+//! @SYMTestType CIT
+//! @SYMTestPriority Critical
+//! @SYMTestStatus Implemented
+//! @SYMTestCaseDesc Test the behaviour of a server which automatically defers acknowledgement to shutdown state change
+//! @SYMTestActions 1.Create a thread and connect to the server with a domain Id and request for shutdown state change notification
+//! 2.Delete the object, which automatically cancels the state change notification
+//! 3.Check whether the test completes without any error
+//! @SYMTestExpectedResults The test completes with error code, KErrNone
+
+START_TEST_BLOCK 100 tcmn_transitionmonitor z:\ssmatest\ssmatest_cmn_transitionmonitor.ini
+ CREATE_OBJECT CSsmStateAwareSession2 CSsmStateAwareSession2
+ COMMAND CSsmStateAwareSession2 NewL
+ COMMAND CSsmStateAwareSession2 ReadIniData RequestAndCancel
+ COMMAND !AsyncError=0 CSsmStateAwareSession2 RequestStateNotification
+ COMMAND CSsmStateAwareSession2 ~
+END_TEST_BLOCK
+END_TESTCASE DVS-SSMA-CMN-0022
--- a/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_stateawaresession.script Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/scripts/ssmatest_cmn_stateawaresession.script Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -36,6 +36,8 @@
//! 7.Check OOM conditions for all leaving functions
//! 8.Add subscribers using AddSubscriberL(). Check that upon notification NotifySubscribers() perfoms appropriate action.
//! 9.Delete some of the subscribers using RemoveSubscriber(). Check that upon notification NotifySubscribers() performs appropriate action.
+//! For CSsmDeferralMonitor:
+//! 10.Create a CSsmDeferralMonitor object and call DeferNotification(). Then delete the object.
//! @SYMTestExpectedResults The expected results are:
//! The request is dealt appropriately resulting in the call to return:
//! 1.Should return KDmErrBadDomainId
@@ -47,5 +49,6 @@
//! 7.All allocated memory should be cleaned up either by the CleanupStack or by a destructor.
//! 8.Added subscribers are notified appropriately
//! 9.Subscribers are notified appropriately except those that were removed MStateChangeNotificationSubscriber
+//! 10.The test should complete without any panics
RUN_TEST_STEP 100 tcmn_server CmnStateAwareSessionStep
END_TESTCASE DEVSRVS-SSMA-CMN-0005
\ No newline at end of file
--- a/sysstatemgmt/systemstatemgr/test/tcmn/src/t_ssmstatemanager.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/src/t_ssmstatemanager.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2009-2010 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"
@@ -278,7 +278,7 @@
INFO_PRINTF1(_L("RSsmStateManager->RunL()is called"));
if (aActive == iActiveNotifyOnChange)
{
- TInt err=iActiveNotifyOnChange->iStatus.Int();
+ TInt err=iActiveNotifyOnChange->iStatus.Int();
if ( err != KErrNone )
{
ERR_PRINTF2(_L("RunL Error %d"), err);
@@ -364,7 +364,31 @@
else if(!(aGetSubState.Compare(_L("ESsmNormalRfOnSubState"))))
{
aSubState = ESsmNormalRfOnSubState;
- }
+ }
+ else if(!(aGetSubState.Compare(_L("ESsmShutdownSubStateCritical"))))
+ {
+ aSubState = ESsmShutdownSubStateCritical;
+ }
+ else if(!(aGetSubState.Compare(_L("ESsmShutdownSubStateNonCritical"))))
+ {
+ aSubState = ESsmShutdownSubStateNonCritical;
+ }
+ else if(!(aGetSubState.Compare(_L("ESsmShutdownSubStatePowerOff"))))
+ {
+ aSubState = ESsmShutdownSubStatePowerOff;
+ }
+ else if(!(aGetSubState.Compare(_L("ESsmShutdownSubStateReStart"))))
+ {
+ aSubState = ESsmShutdownSubStateReStart;
+ }
+ else if(!(aGetSubState.Compare(_L("ESsmFailSubStatePowerOff"))))
+ {
+ aSubState = ESsmFailSubStatePowerOff;
+ }
+ else if(!(aGetSubState.Compare(_L("KSsmAnySubState"))))
+ {
+ aSubState = KSsmAnySubState;
+ }
else
{
ret = EFalse;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/src/t_stateawaresession2.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,273 @@
+// Copyright (c) 2010 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: Test wrapper for CSsmStateAwareSession2
+
+#include <e32std.h>
+#include <e32capability.h>
+#include <test/datawrapper.h>
+#include <ssm/ssmdomaindefs.h>
+#include <ssm/ssmsubstates.hrh>
+#include "ssmsubstateext.hrh"
+
+#include "t_stateawaresession2.h"
+
+const TDmDomainId KTestDdmDomain = {KSM2AppServicesDomain3};
+
+//
+_LIT(KError, "error");
+_LIT(KAsyncIndex, "asyncIndex");
+_LIT(KAcknowledge, "acknowledge");
+
+//commands
+_LIT(KCmdNewL, "NewL");
+_LIT(KCmdReadIniData, "ReadIniData");
+_LIT(KCmdRequestStateNotification, "RequestStateNotification");
+_LIT(KCmdAcknowledgeStateNotification, "AcknowledgeStateNotification");
+_LIT(KCmdRequestStateNotificationCancel, "RequestStateNotificationCancel");
+_LIT(KCmdDestructor, "~");
+
+/**
+ * Constructor
+ */
+TIniData3::TIniData3()
+ : iAcknowledge(ETrue)
+ , iAsyncIndex(0)
+ {}
+/**
+* @return pointer to the object that the data wraps
+*/
+TAny* CTestCStateAwareSession::GetObject()
+ {
+ return iSsmStateAwareSession;
+ }
+
+/**
+ * SetObjectL
+ */
+void CTestCStateAwareSession::SetObjectL(TAny* aAny)
+ {
+ DoCleanup();
+ iSsmStateAwareSession=static_cast<CSsmStateAwareSession2*> (aAny);
+ }
+
+/**
+ * DisownObjectL
+ */
+void CTestCStateAwareSession::DisownObjectL()
+ {
+ iSsmStateAwareSession=NULL;
+ }
+
+/**
+ * Constructor.
+ */
+CTestCStateAwareSession::CTestCStateAwareSession():
+CDataWrapper()
+ {
+ }
+
+/**
+ * Destructor.
+ */
+CTestCStateAwareSession::~CTestCStateAwareSession()
+ {
+ DoCleanup();
+ }
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand the command to process
+ * @param aSection the entry in the ini file requiring the command to be processed
+ *
+ * @return ETrue if the command is processed
+ */
+TBool CTestCStateAwareSession::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt /*aAsyncErrorIndex*/)
+ {
+ TBool retVal = ETrue;
+ if (aCommand == KCmdNewL)
+ {
+ DoCmdNew();
+ }
+ else if (aCommand == KCmdReadIniData)
+ {
+ DoCmdReadIniData(aSection);
+ }
+ else if (aCommand == KCmdAcknowledgeStateNotification)
+ {
+ DoCmdAcknowledgeStateNotification(aSection);
+ }
+ else if (aCommand == KCmdRequestStateNotification)
+ {
+ DoCmdRequestStateNotification();
+ }
+ else if (aCommand == KCmdRequestStateNotificationCancel)
+ {
+ DoCmdRequestStateNotificationCancel();
+ }
+ else if (aCommand == KCmdDestructor)
+ {
+ DoCmdDestructor();
+ }
+ else
+ {
+ retVal = EFalse;
+ }
+
+ return retVal;
+ }
+
+/**
+ * Creates CSsmStateAwareSession2 class instance
+ */
+void CTestCStateAwareSession::DoCmdNew()
+ {
+ INFO_PRINTF1(_L("Create CSsmStateAwareSession2 class instance"));
+ DoCleanup();
+
+ TRAPD(err, iSsmStateAwareSession = CSsmStateAwareSession2::NewL(KTestDdmDomain, *this));
+
+ if (err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CSsmStateAwareSession2::NewL() error %d"), err);
+ SetError(err);
+ }
+ }
+
+/*
+ * Helper function to read ini file data
+ */
+void CTestCStateAwareSession::DoCmdReadIniData(const TDesC& aSection)
+ {
+ if( !GetIntFromConfig(aSection, KAsyncIndex(), iIniData.iAsyncIndex ) ||
+ !GetBoolFromConfig(aSection, KAcknowledge(), iIniData.iAcknowledge ) )
+ {
+ ERR_PRINTF1(_L("Error reading ini file data"));
+ SetError(KErrNotFound);
+ }
+ }
+
+/**
+ * Contains cleanup implementation
+ */
+void CTestCStateAwareSession::DoCleanup()
+ {
+ if(iSsmStateAwareSession != NULL)
+ {
+ INFO_PRINTF1(_L("Deleting current CSsmStateAwareSession2"));
+ delete iSsmStateAwareSession;
+ iSsmStateAwareSession = NULL;
+ }
+ }
+
+/**
+ * Destroy CSsmStateAwareSession2 object
+ */
+void CTestCStateAwareSession::DoCmdDestructor()
+ {
+ INFO_PRINTF1(_L("Destroying the CStateAwareSession2 object"));
+ DoCleanup();
+ }
+
+/**
+ * DoCmdRequestStateNotification
+ */
+void CTestCStateAwareSession::DoCmdRequestStateNotification()
+ {
+ INFO_PRINTF1(_L("CTestCStateAwareSession: RequestStateNotification"));
+ iSsmStateAwareSession->RequestStateNotification();
+ IncOutstanding();
+ }
+
+/**
+ * DoCmdAcknowledgeStateNotification
+ */
+void CTestCStateAwareSession::DoCmdAcknowledgeStateNotification(const TDesC& aSection)
+ {
+ INFO_PRINTF1(_L("CTestCStateAwareSession: AcknowledgeStateNotification"));
+ TInt error;
+ if (!GetIntFromConfig(aSection, KError(), error ))
+ {
+ //set default error value if value is not provided in .ini file
+ error = KErrNone;
+ }
+ iSsmStateAwareSession->AcknowledgeStateNotification(error);
+ }
+
+/**
+ * DoCmdAcknowledgeAndRequestStateNotification
+ */
+void CTestCStateAwareSession::DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection)
+ {
+ INFO_PRINTF1(_L("CTestCStateAwareSession: AcknowledgeAndRequestStateNotification"));
+ TInt error;
+ if (!GetIntFromConfig(aSection, KError(), error ))
+ {
+ //set default error value if value is not provided in .ini file
+ error = KErrNone;
+ }
+ iSsmStateAwareSession->AcknowledgeAndRequestStateNotification(error);
+ IncOutstanding();
+ }
+
+/**
+ * DoCmdRequestStateNotificationCancel
+ */
+void CTestCStateAwareSession::DoCmdRequestStateNotificationCancel()
+ {
+ INFO_PRINTF1(_L("CTestCStateAwareSession: RequestStateNotificationCancel"));
+ iSsmStateAwareSession->RequestStateNotificationCancel();
+ }
+
+/**
+ * HandleTransition
+ */
+void CTestCStateAwareSession::HandleTransition(TInt aError)
+ {
+ INFO_PRINTF1(_L("CTestCStateAwareSession::HandleTransition"));
+ TSsmState currentState;
+ currentState = iSsmStateAwareSession->GetState();
+ TUint16 currentMainState = currentState.MainState();
+ TUint16 currentSubState = currentState.SubState();
+ if(currentMainState == ESsmShutdown &&
+ currentSubState == ESsmShutdownSubStateCritical &&
+ iIniData.iAcknowledge)
+ {
+ iSsmStateAwareSession->AcknowledgeStateNotification(aError);
+ }
+ }
+
+/**
+ * HandleDeferralError
+ */
+TInt CTestCStateAwareSession::HandleDeferralError(TInt aError)
+ {
+ INFO_PRINTF2(_L("CTestCStateAwareSession::HandleDeferralError error = %d"), aError);
+ RDebug::Printf("Entered CTestCStateAwareSession::HandleDeferralError() with error %d", aError);
+ TSsmState currentState;
+ currentState = iSsmStateAwareSession->GetState();
+ TUint16 currentMainState = currentState.MainState();
+ TUint16 currentSubState = currentState.SubState();
+ if(currentMainState == ESsmShutdown &&
+ currentSubState == ESsmNormalShutdown)
+ {
+ iSsmStateAwareSession->AcknowledgeAndRequestStateNotification(KErrNone);
+ IncOutstanding();
+ }
+ else
+ {
+ SetAsyncError(iIniData.iAsyncIndex, aError);
+ }
+ DecOutstanding();
+ return KErrNone;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/src/t_stateawaresessionwrapper.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,841 @@
+// Copyright (c) 2010 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: Test wrapper for RSsmStateAwareSession
+
+#include <e32std.h>
+#include <e32capability.h>
+#include <test/datawrapper.h>
+#include <ssm/ssmdomaindefs.h>
+#include <ssm/ssmsubstates.hrh>
+#include <ssm/startupdomainpskeys.h>
+#include <e32debug.h>
+
+#include "t_stateawaresessionwrapper.h"
+
+//
+_LIT(KDomainId, "domainId");
+_LIT(KAcknowledge, "acknowledge");
+_LIT(KError, "error");
+_LIT(KCancelDeferral, "cancelDeferral");
+_LIT(KCount, "count");
+_LIT(KAckLastState, "ackLastState");
+_LIT(KDeferTwice, "deferTwice");
+
+//commands
+_LIT(KCmdNewL, "NewL");
+_LIT(KCmdConnect, "Connect");
+_LIT(KCmdReadIniData, "ReadIniData");
+_LIT(KCmdRequestStateNotification, "RequestStateNotification");
+_LIT(KCmdAcknowledgeStateNotification, "AcknowledgeStateNotification");
+_LIT(KCmdClose, "Close");
+_LIT(KCmdRequestStateNotificationCancel, "RequestStateNotificationCancel");
+_LIT(KCmdAcknowledgeAndRequestStateNotification, "AcknowledgeAndRequestStateNotification");
+_LIT(KCmdDeferAcknowledgement, "DeferAcknowledgement");
+_LIT(KCmdReturnCount, "ReturnCount");
+_LIT(KCmdDestructor, "~");
+
+/**
+ * Helper method to map the DomainIds.
+ */
+static TBool MapToDomainId(TPtrC& aDomainIdName, TDmDomainId& aDomainId);
+
+/**
+ * Constructor
+ */
+TIniData1::TIniData1()
+ : iCancelDeferral(EFalse)
+ , iAckLastState(EFalse)
+ , iDeferTwice(EFalse)
+ , iCount(0)
+ , iAcknowledge(ETrue)
+ {}
+
+/**
+ * Constructor
+ */
+TIniData2::TIniData2()
+ : iCount(0)
+ , iAcknowledge(ETrue)
+ {}
+
+/**
+ * Two phase constructor
+ */
+CTestRStateAwareSession1* CTestRStateAwareSession1::NewL()
+ {
+ CTestRStateAwareSession1* testStateAwareSession = new (ELeave) CTestRStateAwareSession1();
+ CleanupStack::PushL(testStateAwareSession);
+ testStateAwareSession->ConstructL();
+ CleanupStack::Pop(testStateAwareSession);
+ return testStateAwareSession;
+ }
+
+/**
+* @return pointer to the object that the data wraps
+*/
+TAny* CTestRStateAwareSession1::GetObject()
+ {
+ return iSsmStateAwareSession;
+ }
+
+/**
+ * SetObjectL
+ */
+void CTestRStateAwareSession1::SetObjectL(TAny* aAny)
+ {
+ DoCleanup();
+ iSsmStateAwareSession=static_cast<RSsmStateAwareSession*> (aAny);
+ }
+
+/**
+ * DisownObjectL
+ */
+void CTestRStateAwareSession1::DisownObjectL()
+ {
+ iSsmStateAwareSession=NULL;
+ }
+
+/**
+ * Protected constructor. First phase construction
+ */
+CTestRStateAwareSession1::CTestRStateAwareSession1():
+CDataWrapper()
+ {
+ }
+
+/**
+ * Protected constructor. Second phase construction
+ */
+void CTestRStateAwareSession1::ConstructL()
+ {
+ iActiveNotifyOnChange = CActiveCallback::NewL(*this);
+ iActiveNotifyOnChange2 = CActiveCallback::NewL(*this);
+ }
+
+/**
+ * Destructor.
+ */
+CTestRStateAwareSession1::~CTestRStateAwareSession1()
+ {
+ DoCleanup();
+ delete iActiveNotifyOnChange;
+ delete iActiveNotifyOnChange2;
+ }
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand the command to process
+ * @param aSection the entry in the ini file requiring the command to be processed
+ *
+ * @return ETrue if the command is processed
+ */
+TBool CTestRStateAwareSession1::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+ {
+ TBool retVal = ETrue;
+ if (aCommand == KCmdNewL)
+ {
+ DoCmdNew();
+ }
+ else if (aCommand == KCmdConnect)
+ {
+ DoCmdConnect(aSection);
+ }
+ else if (aCommand == KCmdReadIniData)
+ {
+ DoCmdReadIniData(aSection);
+ }
+ else if (aCommand == KCmdRequestStateNotification)
+ {
+ DoCmdRequestStateNotification(aAsyncErrorIndex);
+ }
+ else if (aCommand == KCmdAcknowledgeStateNotification)
+ {
+ DoCmdAcknowledgeStateNotification(aSection);
+ }
+ else if (aCommand == KCmdClose)
+ {
+ DoCmdClose();
+ }
+ else if (aCommand == KCmdRequestStateNotificationCancel)
+ {
+ DoCmdRequestStateNotificationCancel();
+ }
+ else if (aCommand == KCmdAcknowledgeAndRequestStateNotification)
+ {
+ DoCmdAcknowledgeAndRequestStateNotification(aSection, aAsyncErrorIndex);
+ }
+ else if (aCommand == KCmdDeferAcknowledgement)
+ {
+ DoCmdDeferAcknowledgement( aAsyncErrorIndex);
+ }
+ else if (aCommand == KCmdReturnCount)
+ {
+ DoCmdReturnCount(aSection);
+ }
+ else if (aCommand == KCmdDestructor)
+ {
+ DoCmdDestructor();
+ }
+ else
+ {
+ retVal = EFalse;
+ }
+
+ return retVal;
+ }
+
+/**
+ * Creates RSSmStateAwareSession class instance
+ */
+void CTestRStateAwareSession1::DoCmdNew()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: Create RSsmStateAwareSession class instance"));
+ DoCleanup();
+
+ TRAPD(err, iSsmStateAwareSession = new (ELeave)RSsmStateAwareSession());
+
+ if (err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession1: new error %d"), err);
+ SetError(err);
+ }
+ }
+
+/**
+ * Close RSsmStateAwareSession handle
+ */
+void CTestRStateAwareSession1::DoCmdClose()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: Close RSsmStateAwareSession"));
+ iSsmStateAwareSession->Close();
+ }
+
+/**
+ * Contains cleanup implementation
+ */
+void CTestRStateAwareSession1::DoCleanup()
+ {
+ if(iSsmStateAwareSession != NULL)
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: Deleting current RSsmStateAwareSession"));
+ delete iSsmStateAwareSession;
+ iSsmStateAwareSession = NULL;
+ }
+ }
+
+/**
+ * Destroy RSsmStateAwareSession object
+ */
+void CTestRStateAwareSession1::DoCmdDestructor()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: Destroying the RStateAwareSession object"));
+ DoCleanup();
+ }
+
+/**
+ * Check whether the client is deferred expected no. of times
+ */
+void CTestRStateAwareSession1::DoCmdReturnCount(const TDesC& aSection)
+ {
+ TInt expectedCount = 0;
+ if ( !GetIntFromConfig(aSection, KCount(), expectedCount))
+ {
+ ERR_PRINTF1(_L("CTestRStateAwareSession1: Error reading ini file data"));
+ SetError(KErrNotFound);
+ }
+ if (iCount == expectedCount)
+ return;
+ ERR_PRINTF3(_L("CTestRStateAwareSession1: Actual count = %d, Expected count = %d"), iCount, expectedCount);
+ SetError(KErrGeneral);
+ }
+
+/*
+ * Helper function to read ini file data
+ */
+void CTestRStateAwareSession1::DoCmdReadIniData(const TDesC& aSection)
+ {
+ if( !GetIntFromConfig(aSection, KCount(), iIniData.iCount) ||
+ !GetBoolFromConfig(aSection, KCancelDeferral(), iIniData.iCancelDeferral) ||
+ !GetBoolFromConfig(aSection, KAckLastState(), iIniData.iAckLastState) ||
+ !GetBoolFromConfig(aSection, KDeferTwice(), iIniData.iDeferTwice) )
+ {
+ ERR_PRINTF1(_L("CTestRStateAwareSession1: Error reading ini file data"));
+ SetError(KErrNotFound);
+ }
+ }
+
+/**
+ * Connects a client to RSsmStateAwareSession with Domain Id
+ */
+void CTestRStateAwareSession1::DoCmdConnect(const TDesC& aSection)
+ {
+ TPtrC domainIdName;
+ if (!GetStringFromConfig(aSection, KDomainId(), domainIdName))
+ {
+ //set default domainId if value is not provided in .ini file
+ domainIdName.Set(_L("KSM2UiServicesDomain1"));
+ }
+ TDmDomainId domainId;
+ if(MapToDomainId(domainIdName, domainId ))
+ {
+ INFO_PRINTF2(_L("CTestRStateAwareSession1: Calling RSsmStateAwareSession->Connect with domain id %S"), &domainIdName );
+ TInt err = iSsmStateAwareSession->Connect(domainId);
+ if (KErrNone != err)
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession1: Connect() error %d"), err);
+ SetError(err);
+ }
+ }
+ else
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession1: Could not map %S to domain Id"), &domainIdName );
+ SetBlockResult(EFail);
+ }
+ }
+
+/**
+ * DoCmdRequestStateNotification
+ */
+void CTestRStateAwareSession1::DoCmdRequestStateNotification(const TInt aAsyncErrorIndex)
+ {
+ INFO_PRINTF2(_L("CTestRStateAwareSession1: RequestStateNotification with Async Error Index: %d"), aAsyncErrorIndex);
+ iSsmStateAwareSession->RequestStateNotification(iActiveNotifyOnChange->iStatus);
+ iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+ IncOutstanding();
+ }
+
+/**
+ * DoCmdAcknowledgeStateNotification
+ */
+void CTestRStateAwareSession1::DoCmdAcknowledgeStateNotification(const TDesC& aSection)
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: AcknowledgeStateNotification"));
+ TInt error;
+ if (!GetIntFromConfig(aSection, KError(), error ))
+ {
+ //set default error value if value is not provided in .ini file
+ error = KErrNone;
+ }
+ iSsmStateAwareSession->AcknowledgeStateNotification(error);
+ }
+
+/**
+ * DoCmdAcknowledgeAndRequestStateNotification
+ */
+void CTestRStateAwareSession1::DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection, const TInt aAsyncErrorIndex)
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: AcknowledgeAndRequestStateNotification"));
+ TInt error;
+ if (!GetIntFromConfig(aSection, KError(), error ))
+ {
+ //set default error value if value is not provided in .ini file
+ error = KErrNone;
+ }
+ iSsmStateAwareSession->AcknowledgeAndRequestStateNotification(error, iActiveNotifyOnChange->iStatus );
+ iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+ IncOutstanding();
+ }
+
+/**
+ * DoCmdRequestStateNotificationCancel
+ */
+void CTestRStateAwareSession1::DoCmdRequestStateNotificationCancel()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: RequestStateNotificationCancel is called "));
+ iSsmStateAwareSession->RequestStateNotificationCancel();
+ }
+
+void CTestRStateAwareSession1::DoCmdDeferAcknowledgement(const TInt aAsyncErrorIndex)
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: DeferAcknowledgement is called"));
+ iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+ iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+ IncOutstanding();
+ }
+
+void CTestRStateAwareSession1::RunL(CActive* aActive, TInt aIndex)
+ {
+ TInt error = KErrNone;
+
+ if ( aActive == iActiveNotifyOnChange )
+ {
+ error = iActiveNotifyOnChange->iStatus.Int();
+ switch ( error )
+ {
+ case KErrNone:
+ {
+ //Request has completed i.e. The member must either defer again or acknowledge.
+ TSsmState currentState = iSsmStateAwareSession->State();
+ // This component only responds to Shutdown state events.
+ if ( (currentState.MainState() == ESsmShutdown) &&
+ (currentState.SubState() == ESsmShutdownSubStateCritical || currentState.SubState() == ESsmShutdownSubStateNonCritical) )
+ {
+ if( iCount < iIniData.iCount )
+ {
+ iCount++;
+ iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+ iActiveNotifyOnChange->Activate(aIndex);
+ IncOutstanding();
+ if( iIniData.iDeferTwice )
+ {
+ iCount++;
+ iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange2->iStatus);
+ iActiveNotifyOnChange2->Activate(aIndex);
+ IncOutstanding();
+ }
+ else if( iIniData.iAckLastState )
+ {
+ iSsmStateAwareSession->AcknowledgeStateNotification(KErrNone);
+ }
+ else if( iIniData.iCancelDeferral )
+ {
+ iSsmStateAwareSession->CancelDeferral();
+ }
+ }
+ else
+ {
+ //Acknowledge with success
+ if (iIniData.iAcknowledge)
+ {
+ iSsmStateAwareSession->AcknowledgeStateNotification(KErrNone);
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ // Error
+ INFO_PRINTF2(_L("CTestRStateAwareSession1: Test returned with error = %d"),error);
+ SetAsyncError(aIndex, error);
+ }
+ }
+ }
+ else if ( aActive == iActiveNotifyOnChange2 )
+ {
+ error = iActiveNotifyOnChange2->iStatus.Int();
+ SetAsyncError(aIndex, error);
+ }
+ DecOutstanding();
+ }
+
+/**
+ Virtual DoCancel - Request to cancel the asynchronous command
+ @see - MTPActiveCallback
+ @param aActive Active Object that DoCancel has been called on
+ @pre - N/A
+ @post - N/A
+ @leave system wide error code
+*/
+void CTestRStateAwareSession1::DoCancel(CActive* aActive, TInt aIndex)
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession1: DoCancel"));
+ if(aActive == iActiveNotifyOnChange)
+ {
+ TInt err = iActiveNotifyOnChange->iStatus.Int();
+ if (err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession1: DoCancel Error %d"), err);
+ SetAsyncError(aIndex, err);
+ }
+ }
+ else if(aActive == iActiveNotifyOnChange2)
+ {
+ TInt err = iActiveNotifyOnChange2->iStatus.Int();
+ if (err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession1: DoCancel Error %d"), err);
+ SetAsyncError(aIndex, err);
+ }
+ }
+ DecOutstanding();
+ }
+
+/**
+ * Helper method to map the DomainIds. This can be extendable for other domain Ids
+ */
+static TBool MapToDomainId(TPtrC& aDomainIdName, TDmDomainId& aDomainId)
+ {
+ TBool ret = ETrue;
+ if (!(aDomainIdName.Compare(_L("KSM2UiServicesDomain1"))))
+ {
+ aDomainId = KSM2UiServicesDomain1;
+ }
+ else if (!(aDomainIdName.Compare(_L("KSM2HALDomain2"))))
+ {
+ aDomainId = KSM2HALDomain2;
+ }
+ else if (!(aDomainIdName.Compare(_L("KSM2HALDomain3"))))
+ {
+ aDomainId = KSM2HALDomain3;
+ }
+ else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain1"))))
+ {
+ aDomainId = KSM2AppServicesDomain1;
+ }
+ else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain2"))))
+ {
+ aDomainId = KSM2AppServicesDomain2;
+ }
+ else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain3"))))
+ {
+ aDomainId = KSM2AppServicesDomain3;
+ }
+ else if (!(aDomainIdName.Compare(_L("KSM2AppServicesDomain4"))))
+ {
+ aDomainId = KSM2AppServicesDomain4;
+ }
+ else
+ {
+ ret = EFalse;
+ }
+ return ret;
+ }
+
+
+/**
+ * Two phase constructor
+ */
+CTestRStateAwareSession2* CTestRStateAwareSession2::NewL()
+ {
+ CTestRStateAwareSession2* testStateAwareSession = new (ELeave) CTestRStateAwareSession2();
+ CleanupStack::PushL(testStateAwareSession);
+ testStateAwareSession->ConstructL();
+ CleanupStack::Pop(testStateAwareSession);
+ return testStateAwareSession;
+ }
+
+/**
+* @return pointer to the object that the data wraps
+*/
+TAny* CTestRStateAwareSession2::GetObject()
+ {
+ return iSsmStateAwareSession;
+ }
+
+/**
+ * SetObjectL
+ */
+void CTestRStateAwareSession2::SetObjectL(TAny* aAny)
+ {
+ DoCleanup();
+ iSsmStateAwareSession=static_cast<RSsmStateAwareSession*> (aAny);
+ }
+
+/**
+ * DisownObjectL
+ */
+void CTestRStateAwareSession2::DisownObjectL()
+ {
+ iSsmStateAwareSession=NULL;
+ }
+
+/**
+ * Protected constructor. First phase construction
+ */
+CTestRStateAwareSession2::CTestRStateAwareSession2():
+CDataWrapper()
+ {
+ }
+
+/**
+ * Protected constructor. Second phase construction
+ */
+void CTestRStateAwareSession2::ConstructL()
+ {
+ iActiveNotifyOnChange = CActiveCallback::NewL(*this);
+ }
+
+/**
+ * Destructor.
+ */
+CTestRStateAwareSession2::~CTestRStateAwareSession2()
+ {
+ DoCleanup();
+ delete iActiveNotifyOnChange;
+ }
+
+/**
+ * Process a command read from the ini file
+ *
+ * @param aCommand the command to process
+ * @param aSection the entry in the ini file requiring the command to be processed
+ *
+ * @return ETrue if the command is processed
+ */
+TBool CTestRStateAwareSession2::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+ {
+ TBool retVal = ETrue;
+ if (aCommand == KCmdNewL)
+ {
+ DoCmdNew();
+ }
+ else if (aCommand == KCmdConnect)
+ {
+ DoCmdConnect(aSection);
+ }
+ else if (aCommand == KCmdReadIniData)
+ {
+ DoCmdReadIniData(aSection);
+ }
+ else if (aCommand == KCmdRequestStateNotification)
+ {
+ DoCmdRequestStateNotification(aAsyncErrorIndex);
+ }
+ else if (aCommand == KCmdAcknowledgeStateNotification)
+ {
+ DoCmdAcknowledgeStateNotification(aSection);
+ }
+ else if (aCommand == KCmdClose)
+ {
+ DoCmdClose();
+ }
+ else if (aCommand == KCmdRequestStateNotificationCancel)
+ {
+ DoCmdRequestStateNotificationCancel();
+ }
+ else if (aCommand == KCmdAcknowledgeAndRequestStateNotification)
+ {
+ DoCmdAcknowledgeAndRequestStateNotification(aSection, aAsyncErrorIndex);
+ }
+ else if (aCommand == KCmdDestructor)
+ {
+ DoCmdDestructor();
+ }
+ else
+ {
+ retVal = EFalse;
+ }
+
+ return retVal;
+ }
+
+/**
+ * Creates RSSmStateAwareSession class instance
+ */
+void CTestRStateAwareSession2::DoCmdNew()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession2: Create RSsmStateAwareSession class instance"));
+ DoCleanup();
+
+ TRAPD(err, iSsmStateAwareSession = new (ELeave)RSsmStateAwareSession());
+
+ if (err != KErrNone)
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession2: new error %d"), err);
+ SetError(err);
+ }
+ }
+
+/**
+ * Close RSsmStateAwareSession handle
+ */
+void CTestRStateAwareSession2::DoCmdClose()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession2: Close RSsmStateAwareSession"));
+ iSsmStateAwareSession->Close();
+ }
+
+/**
+ * Contains cleanup implementation
+ */
+void CTestRStateAwareSession2::DoCleanup()
+ {
+ if(iSsmStateAwareSession != NULL)
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession2: Deleting current RSsmStateAwareSession"));
+ delete iSsmStateAwareSession;
+ iSsmStateAwareSession = NULL;
+ }
+ }
+
+/**
+ * Destroy RSsmStateAwareSession object
+ */
+void CTestRStateAwareSession2::DoCmdDestructor()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession2: Destroying the RStateAwareSession object"));
+ DoCleanup();
+ }
+
+/**
+ * Connects a client to RSsmStateAwareSession with Domain Id
+ */
+void CTestRStateAwareSession2::DoCmdConnect(const TDesC& aSection)
+ {
+ TPtrC domainIdName;
+ if (!GetStringFromConfig(aSection, KDomainId(), domainIdName))
+ {
+ //set default domainId if value is not provided in .ini file
+ domainIdName.Set(_L("KSM2UiServicesDomain1"));
+ }
+ TDmDomainId domainId;
+ if(MapToDomainId(domainIdName, domainId ))
+ {
+ INFO_PRINTF2(_L("CTestRStateAwareSession2: Calling RSsmStateAwareSession->Connect with domain id %S"), &domainIdName );
+ TInt err = iSsmStateAwareSession->Connect(domainId);
+ if (KErrNone != err)
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession2: Connect() error %d"), err);
+ SetError(err);
+ }
+ }
+ else
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession2: Could not map %S to domain Id"), &domainIdName );
+ SetBlockResult(EFail);
+ }
+ }
+
+/*
+ * Helper function to read ini file data
+ */
+void CTestRStateAwareSession2::DoCmdReadIniData(const TDesC& aSection)
+{
+ if( !GetIntFromConfig(aSection,KCount(), iIniData.iCount) ||
+ !GetBoolFromConfig(aSection,KAcknowledge(), iIniData.iAcknowledge) )
+ {
+ ERR_PRINTF1(_L("Error reading ini file data"));
+ SetError(KErrNotFound);
+ }
+}
+
+/**
+ * DoCmdRequestStateNotification
+ */
+void CTestRStateAwareSession2::DoCmdRequestStateNotification(const TInt aAsyncErrorIndex)
+ {
+ INFO_PRINTF2(_L("CTestRStateAwareSession2: RequestStateNotification with Asyc Error Index: %d"), aAsyncErrorIndex);
+ iSsmStateAwareSession->RequestStateNotification(iActiveNotifyOnChange->iStatus);
+ iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+ IncOutstanding();
+ }
+
+/**
+ * DoCmdAcknowledgeStateNotification
+ */
+void CTestRStateAwareSession2::DoCmdAcknowledgeStateNotification(const TDesC& aSection)
+ {
+ TInt error;
+ if (!GetIntFromConfig(aSection, KError(), error ))
+ {
+ //set default error value if value is not provided in .ini file
+ error = KErrNone;
+ }
+ iSsmStateAwareSession->AcknowledgeStateNotification(error);
+ }
+
+/**
+ * DoCmdAcknowledgeAndRequestStateNotification
+ */
+void CTestRStateAwareSession2::DoCmdAcknowledgeAndRequestStateNotification(const TDesC& aSection, const TInt aAsyncErrorIndex)
+ {
+ TInt error;
+ if (!GetIntFromConfig(aSection, KError(), error ))
+ {
+ //set default error value if value is not provided in .ini file
+ error = KErrNone;
+ }
+ iSsmStateAwareSession->AcknowledgeAndRequestStateNotification(error, iActiveNotifyOnChange->iStatus );
+ iActiveNotifyOnChange->Activate(aAsyncErrorIndex);
+ IncOutstanding();
+ }
+
+/**
+ * DoCmdRequestStateNotificationCancel
+ */
+void CTestRStateAwareSession2::DoCmdRequestStateNotificationCancel()
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession2: RequestStateNotificationCancel is called "));
+ iSsmStateAwareSession->RequestStateNotificationCancel();
+ }
+
+/**
+ Virtual RunL - Called on completion of an asynchronous command
+ @see MTPActiveCallback
+ @param aActive Active Object that RunL has been called on
+ @pre N/A
+ @post N/A
+ @leave system wide error code
+*/
+void CTestRStateAwareSession2::RunL(CActive* aActive, TInt aIndex)
+ {
+ TInt error = KErrNone;
+
+ if (aActive == iActiveNotifyOnChange)
+ {
+ error = iActiveNotifyOnChange->iStatus.Int();
+ if (error == KErrNone)
+ {
+ // Request has completed i.e. The member must either defer again or acknowledge.
+ TSsmState currentState = iSsmStateAwareSession->State();
+ // This component only responds to Shutdown state events.
+ if ( (currentState.MainState() == ESsmShutdown) &&
+ (currentState.SubState() == ESsmShutdownSubStateCritical || currentState.SubState() == ESsmShutdownSubStateNonCritical) )
+ {
+ if(iCount < iIniData.iCount)
+ {
+ iCount++;
+ iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+ iActiveNotifyOnChange->Activate(aIndex);
+ IncOutstanding();
+ }
+ else
+ {
+ //Acknowledge with success/failure
+ if (iIniData.iAcknowledge)
+ {
+ iSsmStateAwareSession->AcknowledgeStateNotification(KErrNone);
+ }
+ }
+ }
+ else
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession2: Deferring acknowledgement for a state that doesn't support transition monitoring"));
+ iSsmStateAwareSession->DeferAcknowledgement(iActiveNotifyOnChange->iStatus);
+ iActiveNotifyOnChange->Activate(aIndex);
+ IncOutstanding();
+ }
+ }
+ else
+ {
+ INFO_PRINTF2(_L("CTestRStateAwareSession2: RunL Error %d"), error);
+ SetAsyncError(aIndex, error);
+ }
+ }
+ DecOutstanding();
+ }
+
+/**
+ Virtual DoCancel - Request to cancel the asynchronous command
+ @see - MTPActiveCallback
+ @param aActive Active Object that DoCancel has been called on
+ @pre - N/A
+ @post - N/A
+ @leave system wide error code
+*/
+void CTestRStateAwareSession2::DoCancel(CActive* aActive, TInt aIndex)
+ {
+ INFO_PRINTF1(_L("CTestRStateAwareSession2: DoCancel"));
+ if(aActive == iActiveNotifyOnChange)
+ {
+ TInt err = iActiveNotifyOnChange->iStatus.Int();
+ if (err!=KErrNone)
+ {
+ ERR_PRINTF2(_L("CTestRStateAwareSession2: DoCancel Error %d"), err);
+ SetAsyncError(aIndex, err);
+ }
+ }
+ DecOutstanding();
+ }
--- a/sysstatemgmt/systemstatemgr/test/tcmn/src/tcmn_step_stateawaresession.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/src/tcmn_step_stateawaresession.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -24,12 +24,21 @@
#include <e32property.h>
#include <ssm/ssmstatemanager.h>
#include <ssm/ssmstate.h>
+#include <ssm/ssmsubstates.hrh>
+#include <ssm/startupreason.h>
#include "ssmdebug.h"
#include "cmnpanic.h"
#include "ssmatest_utils.h"
#include "tcmn_step_stateawaresession.h"
#include "tssm_ssmclient.h"
#include "tssm_startserver.h"
+
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+#include "ssmstatemonitor.h"
+#include "t_stateawaresession2.h"
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
@@ -275,6 +284,34 @@
__UHEAP_MARKEND;
}
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+//This test is written for coverAGE purposes to call CSsmDeferralMonitor::DoCancel() API.
+//The test is deemed to be successful if it completes without any panic.
+void CCmnStateAwareSessionTest::doTestCSsmDeferralMonitorL()
+ {
+ //Create an active scheduler
+ CActiveScheduler* sched = new(ELeave) CActiveScheduler;
+ CleanupStack::PushL(sched);
+ CActiveScheduler::Install(sched);
+ //Create a CSsmDeferralMonitor object and call DeferNotification()
+ RSsmStateAwareSession rSas;
+ rSas.Connect(KTestDdmDomain);
+ CleanupClosePushL(rSas);
+ CTestCStateAwareSession* tSas = new (ELeave) CTestCStateAwareSession();
+ CleanupStack::PushL(tSas);
+ CSsmStateAwareSession2 *cSas = CSsmStateAwareSession2::NewL(KTestDdmDomain, *tSas);
+ CleanupStack::PushL(cSas);
+ CSsmDeferralMonitor* aDm = new (ELeave) CSsmDeferralMonitor(rSas, *cSas);
+ CleanupStack::PushL(aDm);
+ //Call DeferNotification() so the active object becomes active
+ aDm->DeferNotification();
+ //Destroy all objects. This will call the DoCancel() method of CSsmDeferralMonitor, which is what is intended here.
+ CleanupStack::PopAndDestroy(5);
+ }
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
+
//----------------------------------------------------------------
@@ -311,6 +348,11 @@
__UHEAP_MARK;
doTestCSsmStateAwareSessionL();
doTestForMemoryLeaksL();
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#ifdef TEST_SSM_GRACEFUL_SHUTDOWN
+ doTestCSsmDeferralMonitorL();
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+#endif //TEST_SSM_GRACEFUL_SHUTDOWN
__UHEAP_MARKEND;
INFO_PRINTF1(_L("....CCmnStateAwareSessionTest completed!"));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/src/tcmn_transitionmonitor_server.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,113 @@
+// Copyright (c) 2010 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: Test Server to test transition monitoring feature incase of state change to shutdown state
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+
+
+#include "tcmn_transitionmonitor_server.h"
+#include "t_stateawaresessionwrapper.h"
+#include "t_ssmstatemanager.h"
+#include "t_stateawaresession2.h"
+
+_LIT(KTransitionMonitorServer, "TransitionMonitorServer");
+_LIT(KStateAwareSession1, "RSsmStateAwareSession1");
+_LIT(KStateAwareSession2, "RSsmStateAwareSession2");
+_LIT(KStateManager, "RSsmStateManager");
+_LIT(KStateAwareSession3, "CSsmStateAwareSession2");
+
+CAwareSessionTestServer* CAwareSessionTestServer::NewL( )
+ {
+ CAwareSessionTestServer* server = new (ELeave)CAwareSessionTestServer();
+ CleanupStack::PushL(server);
+ server->ConstructL();
+ CleanupStack::Pop(server);
+ return server;
+ }
+
+static void MainL()
+ {
+ CActiveScheduler* sched=new(ELeave) CActiveScheduler;
+ CActiveScheduler::Install(sched);
+ CAwareSessionTestServer* server = NULL;
+ TRAPD(err, server = CAwareSessionTestServer::NewL());
+ if(!err)
+ {
+ RProcess::Rendezvous(KErrNone);
+ sched->Start();
+ }
+ delete server;
+ delete sched;
+ }
+
+/**
+ Process entry point. Called by client using RProcess API
+ @return - Standard Epoc error code on process exit
+ */
+TInt E32Main(void)
+ {
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ if(cleanup == NULL)
+ {
+ return KErrNoMemory;
+ }
+ TRAPD(err,MainL());
+ if (err)
+ {
+ _LIT(KMainErrorStatement, "KTransitionMonitorServer::MainL - Error: %d");
+ RDebug::Print(KMainErrorStatement, err);
+ User::Panic(KTransitionMonitorServer, err);
+ }
+ delete cleanup;
+ return KErrNone;
+ }
+
+CTestBlockController* CAwareSessionTestServer::CreateTestBlock()
+ {
+ CTestBlockController* controller = NULL;
+ TRAPD(err, (controller = new (ELeave) CAwareSessionTestBlock()));
+ if(KErrNone != err)
+ {
+ User::Panic(KTransitionMonitorServer, err);
+ }
+ return controller;
+ }
+
+CDataWrapper* CAwareSessionTestBlock::CreateDataL(const TDesC& aData)
+ {
+ // Print out the parameters for debugging
+ CDataWrapper* wrapper = NULL;
+ if ( KStateAwareSession1() == aData )
+ {
+ wrapper = CTestRStateAwareSession1::NewL();
+ }
+ else if ( KStateAwareSession2() == aData )
+ {
+ wrapper = CTestRStateAwareSession2::NewL();
+ }
+ else if ( KStateManager() == aData )
+ {
+ wrapper = CTestRSsmStateManager::NewL();
+ }
+ else if ( KStateAwareSession3() == aData)
+ {
+ wrapper = new (ELeave) CTestCStateAwareSession();
+ }
+ return wrapper;
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/tcmn/testdata/ssmatest_cmn_transitionmonitor.ini Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,105 @@
+
+[RSsmStateManager]
+name = RSsmStateManager
+
+[RSsmStateAwareSession1]
+name = RSsmStateAwareSession1
+
+[RSsmStateAwareSession2]
+name = RSsmStateAwareSession2
+
+[CSsmStateAwareSession2]
+name = CSsmStateAwareSession2
+
+[Domain]
+domainId=KSM2AppServicesDomain3
+
+[ShutdownTransitionCriticalSubState]
+mainState = ESsmShutdown
+subState = ESsmShutdownSubStateCritical
+reason = 0
+async = ETrue
+
+[ShutdownTransitionAnySubState]
+mainState = ESsmShutdown
+subState = KSsmAnySubState
+reason = 0
+async = ETrue
+
+[FailTransitionAnySubState]
+mainState = ESsmFail
+subState = KSsmAnySubState
+reason = 0
+async = ETrue
+
+[DeferAckn]
+cancelDeferral = EFalse
+count = 1
+ackLastState = EFalse
+deferTwice = EFalse
+acknowledge = ETrue
+
+[CancelDeferral]
+cancelDeferral = ETrue
+count = 1
+ackLastState = EFalse
+deferTwice = EFalse
+acknowledge = ETrue
+
+[NoAckn]
+cancelDeferral = EFalse
+count = 1
+ackLastState = EFalse
+deferTwice = EFalse
+acknowledge = EFalse
+
+[NoAckn2]
+count = 0
+acknowledge = ETrue
+
+[MaxDefer]
+cancelDeferral = EFalse
+count = 2
+ackLastState = EFalse
+deferTwice = EFalse
+acknowledge = EFalse
+
+[DeferWoCap]
+cancelDeferral = EFalse
+count = 1
+ackLastState = EFalse
+deferTwice = EFalse
+acknowledge = EFalse
+
+[DeferTwice]
+cancelDeferral = EFalse
+count = 1
+ackLastState = EFalse
+deferTwice = ETrue
+acknowledge = EFalse
+
+[DeferTooEarly]
+cancelDeferral = EFalse
+count = 0
+ackLastState = EFalse
+deferTwice = EFalse
+acknowledge = EFalse
+
+[AckLastState]
+cancelDeferral = EFalse
+count = 1
+ackLastState = ETrue
+deferTwice = EFalse
+acknowledge = EFalse
+
+[DeferAutomatic]
+asyncIndex = 6
+acknowledge = ETrue
+
+[MaxAutomaticDefer]
+asyncIndex = 6
+acknowledge = EFalse
+
+[RequestAndCancel]
+asyncIndex = 3
+acknowledge = EFalse
\ No newline at end of file
--- a/sysstatemgmt/systemstatemgr/test/testapps/group/bld.inf Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/testapps/group/bld.inf Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -35,6 +35,7 @@
ssmtestprocwritetime.mmp
ssmcletestproc.mmp
ssmcletestapplication.mmp
+ssmtestprocgood1.mmp
ssmstatetranfromnormalwocap.mmp
PRJ_TESTEXPORTS
--- a/sysstatemgmt/systemstatemgr/test/testapps/group/ssmtestprocgood.iby Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/testapps/group/ssmtestprocgood.iby Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -17,5 +17,6 @@
#define __SSMTESTPROCGOOD_IBY__
file=ABI_DIR\BUILD_DIR\ssmtestprocgood.exe sys\bin\ssmtestprocgood.exe
+file=ABI_DIR\BUILD_DIR\ssmtestprocgood1.exe sys\bin\ssmtestprocgood1.exe
#endif // __SSMTESTPROCGOOD_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/systemstatemgr/test/testapps/group/ssmtestprocgood1.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -0,0 +1,38 @@
+// Copyright (c) 2010 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:
+//
+
+TARGET ssmtestprocgood1.exe
+TARGETTYPE exe
+TARGETPATH /sys/bin
+
+CAPABILITY None
+
+UID 0x0 0x2003458B
+VENDORID 0x70000001
+
+SOURCEPATH ../src
+SOURCE ssmtestprocgood.cpp
+
+USERINCLUDE .
+USERINCLUDE ../inc
+USERINCLUDE ../../../inc
+
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+LIBRARY euser.lib sysmoncli.lib ssmcmn.lib startupproperties.lib
+
+
+
+SMPSAFE
--- a/sysstatemgmt/systemstatemgr/test/tss/inc/tss_procstartmon.h Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tss/inc/tss_procstartmon.h Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -47,7 +47,7 @@
public:
void DoTestMonSyncL();
- void DoTestMonForAlreadyStartedProcL();
+ void DoTestMonForAlreadyStartedProcL(const TDesC& aFileNameWithPath, const TDesC& aProcName);
private:
CActiveScheduler* iActiveScheduler;
--- a/sysstatemgmt/systemstatemgr/test/tss/src/tss_procstartmon.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatemgr/test/tss/src/tss_procstartmon.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -31,6 +31,8 @@
const TInt KThrottleTime = 15000000; //15s
const TInt KStartMonStopperTimeout = 5000000; // Could (probably) be shaved.
+_LIT(KTestProcGoodFullPath, "z:\\sys\\bin\\ssmtestprocgood1.exe");
+_LIT(KTestProcName, "ssmtestprocgood1.exe");
TVerdict CSsTestStepProcStartMon::doTestStepL( void )
{
@@ -41,10 +43,14 @@
__UHEAP_MARK;
- TRAP(err, DoTestMonForAlreadyStartedProcL());
+ TRAP(err, DoTestMonForAlreadyStartedProcL(KTestProcGoodFullPath, KTestProcName));
TEST(err == KErrNone);
- INFO_PRINTF2(_L("DoTestMonForAlreadyStartedProcL completed with err = %d"), err);
+ INFO_PRINTF2(_L("DoTestMonForAlreadyStartedProcL using exe name with full path completed with err = %d"), err);
+ TRAP(err, DoTestMonForAlreadyStartedProcL(KTestProcGood, KTestProcGood));
+ TEST(err == KErrNone);
+ INFO_PRINTF2(_L("DoTestMonForAlreadyStartedProcL using only exe name[without path] completed with err = %d"), err);
+
TRAP(err, DoTestMonSyncL());
TEST(err == KErrNone);
INFO_PRINTF2(_L("DoTestMonSyncL completed with err = %d"), err);
@@ -121,13 +127,13 @@
CleanupStack::PopAndDestroy( 4, startupProperties );
}
-void CSsTestStepProcStartMon::DoTestMonForAlreadyStartedProcL()
+void CSsTestStepProcStartMon::DoTestMonForAlreadyStartedProcL(const TDesC& aFileNameWithPath, const TDesC& aProcName)
{
INFO_PRINTF1( _L("Performing Process-monitor test for already started process") );
RProcess process;
CleanupClosePushL(process);
- User::LeaveIfError(process.Create(KTestProcGood, KLaunchServerCommandLineOption));
+ User::LeaveIfError(process.Create(aProcName, KLaunchServerCommandLineOption));
TRequestStatus status;
process.Rendezvous(status);
@@ -151,7 +157,7 @@
CleanupStack::PushL( startupProperties );
// Need to start testprocess as a server so that we can tell it to stop being monitored.
- startupProperties->SetFileParamsL(KTestProcGood, KLaunchServerCommandLineOption);
+ startupProperties->SetFileParamsL(aFileNameWithPath, KLaunchServerCommandLineOption);
startupProperties->SetCommandTypeL(ESsmCmdStartProcess);
startupProperties->SetExecutionBehaviour(ESsmWaitForSignal);
@@ -201,7 +207,8 @@
testProcServerSession.CancelMonitor();
testProcServerSession.Close();
}
- TEST(1 == FindAndKill(KTestProcGood));
+ TEST(1 == FindAndKill(aProcName));
+
CleanupStack::PopAndDestroy(3, &process);
}
--- a/sysstatemgmt/systemstatereferenceplugins/custcmd/group/customcmds.mmp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatereferenceplugins/custcmd/group/customcmds.mmp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -34,6 +34,11 @@
OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+// This system include will be removed/changed once the security driver code is exported to foundation.
+SYSTEMINCLUDE NON_FOUNDATION_ADAPT_LAYER_SYSTEMINCLUDE
+#endif
+
SOURCEPATH ../src
SOURCE cmdsimsecuritycheck.cpp
SOURCE cmddevicesecuritycheck.cpp
--- a/sysstatemgmt/systemstatereferenceplugins/custcmd/inc/cmdcoopsysselftest.h Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatereferenceplugins/custcmd/inc/cmdcoopsysselftest.h Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -23,7 +23,12 @@
#define __CMDCOOPSYSSELFTEST_H__
#include <ssm/ssmcustomcommand.h>
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+#include <r_sec_logical_channel.h>
+#else
#include <ssm/ssmadaptationcli.h>
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+
NONSHARABLE_CLASS (CCustomCmdCoopSysSelfTest) : public CBase, public MSsmCustomCommand
{
@@ -42,7 +47,14 @@
~CCustomCmdCoopSysSelfTest();
private:
+//Read the selftest result from Security Driver if SYMBIAN_INCLUDE_APP_CENTRIC is enabled.
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+ RSecEnvLogicalChannel iSecEnvLogicalChannel;
+ TBool iSsmLoadSecLdd;
+ TSecSelfTest iParam;
+#else
RSsmStateAdaptation iSsmStateAdaptation;
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
};
#endif // __CMDCOOPSYSSELFTEST_H__
\ No newline at end of file
--- a/sysstatemgmt/systemstatereferenceplugins/custcmd/src/cmdcoopsysselftest.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/sysstatemgmt/systemstatereferenceplugins/custcmd/src/cmdcoopsysselftest.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -20,6 +20,11 @@
*/
#include "cmdcoopsysselftest.h"
+#include "ssmdebug.h"
+
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+_LIT( KSecEnvLogicalDeviceDriverName, "secldd" );
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
CCustomCmdCoopSysSelfTest* CCustomCmdCoopSysSelfTest::NewL()
{
@@ -28,7 +33,10 @@
}
CCustomCmdCoopSysSelfTest::CCustomCmdCoopSysSelfTest()
- {
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+ : iSsmLoadSecLdd(EFalse)
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+ {
}
CCustomCmdCoopSysSelfTest::~CCustomCmdCoopSysSelfTest()
@@ -37,17 +45,45 @@
TInt CCustomCmdCoopSysSelfTest::Initialize(CSsmCustomCommandEnv* /*aCmdEnv*/)
{
+ TInt err = KErrNone;
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+ //Load the logical device.
+ err = User::LoadLogicalDevice(KSecEnvLogicalDeviceDriverName);
+ DEBUGPRINT2A("CCustomCmdCoopSysSelfTest: LoadLogicalDevice returned error %d", err);
+ iSsmLoadSecLdd = (KErrNone == err) ? ETrue : EFalse;
+ if ( KErrNone == err || KErrAlreadyExists == err )
+ {
+ err = iSecEnvLogicalChannel.Open();
+ DEBUGPRINT2A("CCustomCmdCoopSysSelfTest: Opening the Logical channel retured error %d", err);
+ }
+#else
//Connect RSsmStateAdaptation
- return iSsmStateAdaptation.Connect();
+ err = iSsmStateAdaptation.Connect();
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+ return err;
}
void CCustomCmdCoopSysSelfTest::Close()
{
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+ //Cancel the request if there is any
+ iSecEnvLogicalChannel.CancelRequest(KErrCancel);
+ //Close the channel.
+ iSecEnvLogicalChannel.Close();
+ //Free the ldd if it is loaded by SSM selftest custom command.
+ if (iSsmLoadSecLdd)
+ {
+ //Ignore the error returned by unloading the logical device.
+ TInt err = User::FreeLogicalDevice(KSecEnvDriverName);
+ DEBUGPRINT2A("CCustomCmdCoopSysSelfTest: FreeLogicalDevice() returned error %d", err);
+ }
+#else
//Cancel the request if there is any
iSsmStateAdaptation.RequestCancel();
- //Close RSsmStateAdaptation
+ // Close RSsmStateAdaptation
iSsmStateAdaptation.Close();
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
}
void CCustomCmdCoopSysSelfTest::Release()
@@ -57,12 +93,22 @@
void CCustomCmdCoopSysSelfTest::Execute(const TDesC8& /*aParams*/, TRequestStatus& aStatus)
{
- //Request coop system to perform self test
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+ iParam.iSelfTest = TSecSelfTest::ESelfTestSecurity;
+ iSecEnvLogicalChannel.ServiceRequest(aStatus, iParam);
+#else
+//Request coop system to perform self test
iSsmStateAdaptation.RequestCoopSysSelfTest(aStatus);
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
+
}
void CCustomCmdCoopSysSelfTest::ExecuteCancel()
{
+#ifdef SYMBIAN_INCLUDE_APP_CENTRIC
+ iSecEnvLogicalChannel.CancelRequest(KErrCancel);
+#else
//Cancel the request if there is any
iSsmStateAdaptation.RequestCancel();
+#endif //SYMBIAN_INCLUDE_APP_CENTRIC
}
--- a/systemhealthmanagement/systemhealthmgr/sysmonsrc/timerlist.cpp Wed Sep 29 15:13:21 2010 +0300
+++ b/systemhealthmanagement/systemhealthmgr/sysmonsrc/timerlist.cpp Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -47,29 +47,36 @@
{
CTimer::ConstructL();
}
-
+
+static void DoCleanUp(TAny* aTimerInfo)
+ {
+ CTimerList::TTimerInfo* timerInfo = static_cast<CTimerList::TTimerInfo*>(aTimerInfo);
+ delete timerInfo;
+ timerInfo = NULL;
+ }
+
TInt32 CTimerList::AddL(const TTimeIntervalMicroSeconds32& aInterval, const TCallBack& aCallBack)
{
TTimerInfo* info = new(ELeave) TTimerInfo;
-
+ CleanupStack::PushL(TCleanupItem(DoCleanUp, info));
info->iCallBack = aCallBack;
info->iTime.UniversalTime();
info->iTime += TTimeIntervalMicroSeconds32(aInterval);
AddL(info);
-
+ CleanupStack::Pop(info);
return reinterpret_cast<TInt32>(info);
}
TInt32 CTimerList::AddL(const TTime& aTime, const TCallBack& aCallBack)
{
TTimerInfo* info = new(ELeave) TTimerInfo;
-
+ CleanupStack::PushL(TCleanupItem(DoCleanUp, info));
info->iCallBack = aCallBack;
info->iTime = aTime;
AddL(info);
-
+ CleanupStack::Pop(info);
return reinterpret_cast<TInt32>(info);
}
--- a/systemhealthmanagement/systemhealthmgr/sysmonsrc/timerlist.h Wed Sep 29 15:13:21 2010 +0300
+++ b/systemhealthmanagement/systemhealthmgr/sysmonsrc/timerlist.h Fri Oct 08 14:33:25 2010 +0300
@@ -1,4 +1,4 @@
-// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2007-2010 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"
@@ -43,14 +43,14 @@
TInt32 AddL(const TTime& aTime, const TCallBack& aCallBack);
void Remove(TInt32 aTimer);
-protected:
class TTimerInfo
{
public:
TTime iTime;
TCallBack iCallBack;
};
-
+
+protected:
void RunL();
void ConstructL();
TInt RunError(TInt aError);