accessoryservices/accessoryserver/src/Server/AccSrvSettingsHandler.cpp
changeset 0 4e1aa6a622a0
child 9 21e939dd208a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/Server/AccSrvSettingsHandler.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,944 @@
+/*
+* Copyright (c) 2002-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:  Control for accessory related settings.
+*
+*/
+
+
+// INCLUDE FILES
+#include "AccSrvSettingsHandler.h"
+#include "AccSrvConnectionController.h"
+#include "acc_debug.h"
+#include <AccessoryTypes.h>
+#include <e32property.h>
+#include <centralrepository.h>
+#include <hwrmdomainpskeys.h>
+#include <AccSettingsDomainCRKeys.h>
+#include <f32file.h>
+#include <hwrmlight.h>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KAccSettingIdLength = 4; // "int:" or "boo:" or "des:"
+const TInt KAccSettingMaxLength = KAccSettingIdLength + KMaxAccModeSetting;
+// Max size in bytes for hwdevices.ini file
+const TInt KHWDevicesFileMaxSize = 4;
+// Maximum number of supported accessory modes
+const TInt KMaxAccessoryMode = 4096;
+// Maximum number of supported settings for each accessory mode
+const TInt KMaxAccessorySetting = 4096;
+// First bit reserved for accessory mode when counting is started from right
+const TInt KAccessoryModeStartBit = 20;
+// First bit reserved for accessory mode setting when counting is started from
+// right
+const TInt KAccessoryModeSettingStartBit = 8;
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+_LIT( KAccSettingInteger, "int:" );
+_LIT( KAccSettingBoolean, "boo:" );
+_LIT( KAccSettingDescriptor, "des:" );
+// File that stores supported HW devices
+_LIT( KHWDevicesFile, "c:\\private\\1020504A\\hwdevices.ini" );
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ================================
+
+// ============================= MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::CAccSrvSettingsHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccSrvSettingsHandler::CAccSrvSettingsHandler( CAccSrvConnectionController* aConCtrl,
+                                                CAccSrvServerModel& aModel )
+    : iConCtrl( aConCtrl ),
+      iModel( aModel ),
+      iLightsOn( EAccSettingsLightsNotSet )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::CAccSrvSettingsHandler()" );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::CAccSrvSettingsHandler - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::ConstructL()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::ConstructL()" );
+
+    // Update settings in model according to CR
+    TInt retval( KErrNone );
+    TInt hwDevices( 0 );
+
+    retval = RProperty::Define( KPSUidHWRM,
+                                KHWRMAccessoryVibraBlocked, 
+                                RProperty::EInt, 
+                                KNoCapability, 
+                                KWriteDeviceDataPolicy);
+
+    if( retval != KErrAlreadyExists )
+        {
+        User::LeaveIfError( retval );   
+        }
+
+    CRepository* repository = CRepository::NewLC( KCRUidAccServer );
+    User::LeaveIfError( repository->Get( KAccServerHWDevices, hwDevices ) );
+    iModel.SetDeviceType( static_cast<TUint32>( hwDevices ) );
+    CleanupStack::PopAndDestroy( repository );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::ConstructL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAccSrvSettingsHandler* CAccSrvSettingsHandler::NewL(
+                                           CAccSrvConnectionController* aConCtrl,
+                                           CAccSrvServerModel& aModel )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::NewL()" );
+
+    CAccSrvSettingsHandler* self = new( ELeave ) CAccSrvSettingsHandler(
+                                                    aConCtrl,
+                                                    aModel );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::NewL - return self" );
+    return self;
+    }
+
+// Destructor
+CAccSrvSettingsHandler::~CAccSrvSettingsHandler()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::~CAccSrvSettingsHandler()" );
+    delete iLightsApi;
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::~CAccSrvSettingsHandler - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::ConnectionStatusChangedL
+// Accessory settings may change when connection status changes. This method
+// updates settings according connection status and user given settings.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::ConnectionStatusChangedL(
+    TAccPolGenericIDArray& aArray )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::ConnectionStatusChangedL()" );
+
+    TAccPolGenericID genericId;
+    TBool vibraAllowed( ETrue );
+
+    // Any accessories connected
+    if( aArray.Count() > 0 )
+        {
+        // get generic id of last connected accessory
+        genericId = aArray.GetGenericIDL( 0 );
+        // check if vibra is really allowed
+        GetVibraAllowed( genericId, vibraAllowed );
+        }
+
+    // Get current vibra status
+    TInt vibraBlocked( 0 );
+    RProperty::Get( KPSUidHWRM, KHWRMAccessoryVibraBlocked, vibraBlocked );
+
+    // Set vibra on/off, if needed
+    if( !vibraAllowed && vibraBlocked == 0 )
+        {
+        // accessory that doesn't support vibra was connected -> set vibra of
+        COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandlerConnectionStatusChangedL() - Vibra PS Key = VibraOff" );
+
+        RProperty::Set( KPSUidHWRM,
+                        KHWRMAccessoryVibraBlocked,
+                        1 );
+        }
+    else if( vibraAllowed && vibraBlocked == 1 )
+        {
+        // accessory that doesn't support vibra was disconnected -> set vibra on
+        COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandlerConnectionStatusChangedL() - Vibra PS Key = VibraOn" );
+
+        RProperty::Set( KPSUidHWRM,
+                        KHWRMAccessoryVibraBlocked,
+                        0 );
+        }
+
+    TBool setLights( EFalse );
+
+    // Accessory connected
+    if( aArray.Count() > 0 )
+        {
+        // check if lights should be put on
+        GetLightsAllowedL( genericId, setLights );
+
+        // Need to set lights on
+        if( setLights )
+            {
+            // accessory with lights on setting connected -> set lights on
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::ConnectionStatusChangedL() - Set lights on" );
+
+            if( !iLightsApi )
+                {
+                iLightsApi = CHWRMLight::NewL();
+                }
+
+            iLightsApi->ReserveLightL( CHWRMLight::ESystemTarget, ETrue, ETrue );
+            iLightsApi->LightOnL( CHWRMLight::ESystemTarget );
+
+            iLightsOn = EAccSettingsLightsOn;
+            }
+        }
+    else if( iLightsOn == EAccSettingsLightsOn )
+        {
+        // accessory with lights on setting disconnected -> set lights off
+        COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::ConnectionStatusChangedL() - Set lights off" );
+
+        iLightsApi->ReleaseLight( CHWRMLight::ESystemTarget );
+
+        delete iLightsApi;
+        iLightsApi = NULL;
+
+        iLightsOn = EAccSettingsLightsOff;
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::ConnectionStatusChangedL() - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::GetSupportedHWDevicesL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CAccSrvSettingsHandler::GetSupportedHWDevicesL() const
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::GetSupportedHWDevicesL()" );
+
+    TUint32 settings( 0 );
+
+    // Read supported HW devices from file
+    RFs session;
+    RFile file;
+    HBufC8* buf = HBufC8::NewL( KHWDevicesFileMaxSize );
+    CleanupStack::PushL( buf );
+
+    TPtr8 ptrBuf( buf->Des() );
+    User::LeaveIfError( session.Connect() );
+    User::LeaveIfError( file.Open( session, KHWDevicesFile, EFileRead ) );
+    file.Read( ptrBuf );
+    file.Close();
+    session.Close();
+
+    TLex8 l( ptrBuf );
+    TInt32 temp;
+    l.Val( temp );
+    settings = static_cast< TUint32 >( temp );
+
+    CleanupStack::Pop( buf );
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::GetSupportedHWDevicesL() - return %d", settings );
+
+    return settings;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::SetHWDeviceSettingsL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::SetHWDeviceSettingsL( TUint32 aSettings,
+                                                   TBool aEnable,
+                                                   TBool aForce  ) const
+    {
+    COM_TRACE_3( "[AccFW:AccServer] CAccSrvSettingsHandler::SetHWDeviceSettingsL( %d, %d, %d  )", aSettings, aEnable, aForce );
+
+    // Valid settings
+    TUint32 settings = ResolveNewSettingsL( aSettings, aEnable, aForce );
+
+    // Update model
+    iModel.SetDeviceType( settings );
+
+    // Update setting to CR
+    CRepository* repository = CRepository::NewL( KCRUidAccServer );
+    TInt crSettings = static_cast<TInt>( settings );
+    repository->Set( KAccServerHWDevices, crSettings );
+    delete repository;
+    repository = NULL;
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::SetHWDeviceSettingsL() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::GetHWDeviceSettings
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CAccSrvSettingsHandler::GetHWDeviceSettings() const
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::GetHWDeviceSettings()" );
+
+    TUint32 settings = iModel.DeviceType();
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::SetHWDeviceSettings() - return %d", settings );
+    return settings;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::SetAccessoryModeSettingL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::SetAccessoryModeSettingL(
+                                        const TAccMode aAccMode,
+                                        const TAccModeSetting& aSetting ) const
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::SetAccessoryModeSettingL()" );
+
+    CRepository* repository = CRepository::NewL( KCRUidAccServer );
+    CleanupStack::PushL( repository );
+
+    // Static or dynamic setting
+    if( StaticKey( aSetting.Id() ) )
+        {
+        // write INT setting to CR
+        TUint32 key = static_cast<TUint32>( aSetting.Id() );
+        TInt setting( 0 );
+        aSetting.GetTInt( setting );
+        User::LeaveIfError( repository->Set( key, setting ) );
+        }
+    else
+        {
+        // write DESCRIPTOR setting to CR
+        TUint32 key = CreateCRKeyL( aAccMode, aSetting.Id() );
+        HBufC* setting = CodeSettingL( aSetting );
+        CleanupStack::PushL( setting );
+        User::LeaveIfError( repository->Set( key, *setting ) );
+        CleanupStack::PopAndDestroy( setting );
+        }
+
+    CleanupStack::PopAndDestroy( repository );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::SetAccessoryModeSettingL() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::GetAccessoryModeSettingL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::GetAccessoryModeSettingL(
+                                        const TAccMode aAccMode,
+                                        TAccModeSetting& aSetting ) const
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::GetAccessoryModeSettingL() AccMode=%d", aAccMode );
+
+    CRepository* repository = CRepository::NewL( KCRUidAccServer );
+    CleanupStack::PushL( repository );
+
+    // static / dynamic key
+    if( StaticKey( aSetting.Id() ) )
+        {
+        // read INT setting from CR
+        TUint32 key = static_cast<TUint32>( aSetting.Id() );
+        TInt setting( 0 );
+        User::LeaveIfError( repository->Get( key, setting ) );
+        aSetting.SetTInt( setting );
+        }
+    else
+        {
+        // read DESCRIPTOR setting from CR
+        TUint32 key = CreateCRKeyL( aAccMode, aSetting.Id() );
+        TBuf16< KAccSettingMaxLength > setting;
+        User::LeaveIfError( repository->Get( key, setting ) );
+        DecodeSettingL( setting, aSetting );
+        }
+
+    CleanupStack::PopAndDestroy( repository );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::GetAccessoryModeSettingL() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::SetAccessoryModeSettingsL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::SetAccessoryModeSettingsL(
+    const TAccMode aAccMode,
+    const TAccModeSettingArray& aArray ) const
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::SetAccessoryModeSettingsL(aAccMode=%d)", aAccMode );
+
+    for(TInt i=0; i<aArray.GetArraySize(); ++i )
+        {
+        TAccModeSetting setting;
+        aArray.GetSetting( i, setting );
+        SetAccessoryModeSettingL( aAccMode, setting );
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::SetAccessoryModeSettingsL() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::GetAccessoryModeSettingsL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::GetAccessoryModeSettingsL(
+    const TAccMode aAccMode,
+    TAccModeSettingArray& aArray ) const
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::GetAccessoryModeSettingsL(aAccMode=%d)", aAccMode );
+
+    // Creation of partialKey and mask below has to be line with logic in
+    // CAccSrvSettingsHandler::CreateCRKeyL() method.
+
+    TUint32 mode = static_cast< TUint32 >( const_cast< TAccMode& >( aAccMode ) );
+    if( mode >= KMaxAccessoryMode )
+        {
+        // mode value is out of range
+        COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::GetAccessoryModeSettingsL() aAccMode=%d is out of range", aAccMode );
+        User::Leave( KErrArgument );
+        }
+
+	// reset possible items in an array
+	aArray.Reset();
+
+	CRepository* repository = CRepository::NewL( KCRUidAccServer );
+    CleanupStack::PushL( repository );
+    
+    // search accessory mode specific dynamic settings
+    RArray< TUint32 > foundKeys;
+    CleanupClosePushL( foundKeys );
+    TUint32 partialKey = mode << KAccessoryModeStartBit;
+    TUint32 mask( 0xfff00000 );
+    repository->FindL( partialKey, mask, foundKeys );	
+        	
+	RArray< TUint32 > array;
+	CleanupClosePushL( array );
+    GetStaticKeys( aAccMode, array );
+  	TAccModeSetting setting;
+    
+    // get mode related static settings for client
+    for ( TInt i=0; i<array.Count(); ++i )
+    	{
+      	TInt intSetting( 0 );
+      	User::LeaveIfError( repository->Get( array[i], intSetting ) );
+      	setting.SetId( array[i] );
+      	setting.SetTInt( intSetting ); // sets type & value
+      	aArray.AddSetting( setting );
+      	}
+
+    // get mode related dynamic settings
+    for ( TInt i=0; i<foundKeys.Count(); ++i )
+    	{
+      	TUint32 key = foundKeys[i];
+      	TBuf16< KAccSettingMaxLength > desSetting;
+      	User::LeaveIfError( repository->Get( key, desSetting ) );
+      	// setting id is stored key's to hexadecimal numbers marked with X:
+    	// 0x000XXX00
+    	TUint32 temp = key & 0x000fff00;
+    	TUint32 id = temp >> KAccessoryModeSettingStartBit;
+    	setting.SetId( id );
+    	DecodeSettingL( desSetting, setting ); // sets type & value
+    	aArray.AddSetting( setting );
+    	}
+	
+	CleanupStack::PopAndDestroy( &array );//array.Close() is called;
+	CleanupStack::PopAndDestroy( &foundKeys );//foundKeys.Close() is called;
+    CleanupStack::PopAndDestroy( repository );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::GetAccessoryModeSettingsL() - return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::ResolveNewSettingsL
+// Note: This method assumes that only ONE HW DEVICE setting is ACTIVE AT THE
+// TIME. If API method RAccessorySettings::SetHWDeviceSettingsL(
+//                          TUint32 aSettings,
+//                                                  TBool aEnable,
+//                                                  TBool aForce )
+//
+// starts to support several active settings at the same time, this method
+// has to be modified.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CAccSrvSettingsHandler::ResolveNewSettingsL( TUint32 aSettings,
+                                                     TBool aEnable,
+                                                     TBool /*aForce*/  ) const
+    {
+    COM_TRACE_2( "[AccFW:AccServer] CAccSrvSettingsHandler::ResolveNewSettingsL( %d, %d )", aSettings, aEnable );
+
+    TUint32 settings( 0 );
+
+    // Clear all settings
+    if( aSettings == KASNoDevice || !aEnable )
+        {
+        COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::ResolveNewSettingsL() - return %d", settings );
+        return settings;
+        }
+
+    // Set new setting
+    switch ( aSettings )
+        {
+        case KASTTY:
+        case KASLoopset:
+		    case KASHeadset:
+		    case KASHeadphones:
+		    case KASLineOut:
+		    case KASTVOut:
+        case KASMusicStand:
+            settings = aSettings;
+            break;
+
+        default:
+            // Only one setting supported at the moment
+            settings = aSettings;
+            break;
+        }
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::ResolveNewSettingsL() - return %d", settings );
+    return settings;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::GetVibraAllowedL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::GetVibraAllowed( TAccPolGenericID& aId,
+                                              TBool& aVibra ) const
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::GetVibraAllowed()" );
+
+    aVibra = ETrue;
+
+    // Critical accessory (wired car kit, music stand connected )
+    if ( aId.DeviceTypeCaps( KDTCarKit ) && aId.PhysicalConnectionCaps( KPCWired ) ||
+        aId.DeviceTypeCaps( KDTOffice ) && aId.PhysicalConnectionCaps( KPCWired ) )
+        {
+        aVibra = EFalse;
+        }
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::GetVibraAllowed() - return aVibra = %d", aVibra );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::GetLightsAllowedL
+// Returns aLights = ETrue, if lights are set on for connected accessory.
+// Returns aLights = EFalse, if lights are not set for connected accessory.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::GetLightsAllowedL( TAccPolGenericID& aId,
+                                                TBool& aLights ) const
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::GetLightsAllowedL()" );
+
+    TUint32 key( 0 );
+
+    // Select CR key
+    if ( aId.DeviceTypeCaps( KDTHeadset ) &&
+         aId.PhysicalConnectionCaps( KPCWired ) )
+        {
+        key = KAccServerWiredHSLights;
+        }
+    else if ( aId.DeviceTypeCaps( KDTHeadset ) &&
+              aId.PhysicalConnectionCaps( KPCBluetooth ) )
+        {
+        key = KAccServerWirelessHSLights;
+        }
+    else if ( aId.DeviceTypeCaps( KDTCarKit ) &&
+              aId.PhysicalConnectionCaps( KPCWired ) )
+        {
+        key = KAccServerWiredCarKitLights;
+        }
+    else if ( aId.DeviceTypeCaps( KDTCarKit ) &&
+              aId.PhysicalConnectionCaps( KPCBluetooth ) )
+        {
+        key = KAccServerWirelessCarKitLights;
+        }
+    else if ( aId.DeviceTypeCaps( KDTTTY ) &&
+              aId.PhysicalConnectionCaps( KPCWired ) )
+        {
+        key = KAccServerTextDeviceLights;
+        }
+    else if ( aId.DeviceTypeCaps( KDTLoopset ) &&
+              aId.PhysicalConnectionCaps( KPCWired ) )
+        {
+        key = KAccServerLoopsetLights;
+        }
+    else if ( aId.DeviceTypeCaps( KDTOffice ) &&
+              aId.PhysicalConnectionCaps( KPCWired ) )
+        {
+        key = KAccServerMusicStandLights;
+        }
+
+    // Get light setting from CR
+    TInt setLights( 0 );
+
+    if ( key )
+        {
+        // If key is selected, get lights status from CenRep        
+        CRepository* repository = CRepository::NewL( KCRUidAccServer );
+        CleanupStack::PushL( repository );
+        User::LeaveIfError( repository->Get( key, setLights ) );
+        CleanupStack::PopAndDestroy( repository );
+        }
+    else
+        {
+        // Key not set, no need to get value from CenRep (it'll leave anyway)
+        // This is the case at least with AV_Connector (TV-Out)
+        }
+
+    aLights = static_cast<TBool>( setLights );
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::GetLightsAllowedL() - return aLights = %d", aLights );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::CreateCRKeyL
+//
+// CR key has to be uniq TUint32 value. It's used to set/get a single accessory
+// setting.
+
+// Key value range from 0x00100000 to 0xFFFFFF00 has been reserved for any
+// accessory related setting that doesn't have influence to Accessory Server
+// behaviour but needs to be stored permanently.
+//
+// Key value created by this method consists as follows:
+//
+// 1. accessory mode is stored to hexadecimal numbers marked with X: 0xXXX00000
+// 2. setting id is stored to hexadecimal numbers marked with X: 0x000XXX00
+//
+// Thus, Accessory Server can store dynamically 4096 accessory modes and for
+// each mode 4096 settings.
+//
+// (2 least significant hexadecimal numbers have been reserved for keys that
+// have an influence to Accessory Server behaviour like KAccServerHWDevices
+// key. Thus, Accessory Server can store 256 settings this kind of settings.)
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint32 CAccSrvSettingsHandler::CreateCRKeyL(
+    const TAccMode aAccMode,
+    const TInt aId ) const
+    {
+    COM_TRACE_2( "[AccFW:AccServer] CAccSrvSettingsHandler::CreateCRKeyL(%d,%d)", aAccMode, aId );
+
+    TUint32 key( 0 );
+
+    // create first part of key from accessory mode
+    TUint32 mode = static_cast< TUint32 >( const_cast< TAccMode& >( aAccMode ) );
+    if( mode >= KMaxAccessoryMode )
+        {
+        // mode value is out of range
+        COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::CreateCRKeyL() aAccMode=%d is out of range", aAccMode );
+        User::Leave( KErrArgument );
+        }
+
+    TUint32 keyPart1 = mode << KAccessoryModeStartBit;
+
+    // Create second part of key from id
+    TUint32 id = static_cast< TUint32 >( const_cast< TInt& >( aId ) );
+    if( id >= KMaxAccessorySetting )
+        {
+        // id value is out of range
+        COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::CreateCRKeyL() aId=%d is out of range", aId );
+        User::Leave( KErrArgument );
+        }
+
+    TUint32 keyPart2 = id << KAccessoryModeSettingStartBit;
+
+    key = keyPart1 + keyPart2;
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::CreateCRKeyL() returns key=%d", key );
+
+    return key;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::CodeSettingL
+//
+// This method is used to convert setting in client format to (TAccModeSetting)
+// dynamic format that used to store setting to CR.
+//
+// Dynamic settings are stored to descriptor that has following structure:
+// xxx:yyy where
+//
+//  xxx tells variable type of a setting. Possible values are "des" for
+//  descriptor, "int" for integer and "boo" for boolean. Variable is stored to
+//  3 characters.
+//
+//  ":" separates variable type information from it's value. Separation character
+//  takes one character.
+//
+//  yyy stores value of a setting. For setting has been reserved 256 characters.
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC* CAccSrvSettingsHandler::CodeSettingL( const TAccModeSetting& aSetting ) const
+    {
+    HBufC* data = HBufC::NewL( KAccSettingMaxLength );
+
+    // store variable type and value to data
+    switch ( aSetting.Type() )
+        {
+        case EAccModeSettingInt:
+            {
+            TInt value( 0 );
+            aSetting.GetTInt( value );
+            TBuf< KAccSettingMaxLength > temp;
+            temp.Num( value );
+            data->Des().Copy( KAccSettingInteger );
+            data->Des().Append( temp );
+            }
+            break;
+
+        case EAccModeSettingBool:
+            {
+            TBool value( EFalse );
+            aSetting.GetTBool( value );
+            TBuf< 1 > temp;
+            if ( value )
+                {
+                _LIT( KTrue, "1" );
+                temp.Append( KTrue );
+                }
+            else
+                {
+                _LIT( KFalse, "0" );
+                temp.Append( KFalse );
+                }
+            data->Des().Copy( KAccSettingBoolean );
+            data->Des().Append( temp );
+            }
+            break;
+
+        case EAccModeSettingDes:
+            {
+            TBuf< KAccSettingMaxLength > value;
+            aSetting.GetTDes( value );
+            data->Des().Copy( KAccSettingDescriptor );
+            data->Des().Append( value );
+            }
+            break;
+
+        default:
+            {
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::CodeSettingL() value was not set !" );
+            delete data;
+            data = NULL;
+            User::Leave( KErrNotFound );
+            }
+            break;
+        }
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler:.CodeSettingL() returns %d", data );
+    return data;
+  }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::DecodeSettingL
+//
+// This method is used to convert dynamically stored setting to format
+// (TAccModeSetting) that client understands.
+//
+// Dynamic settings are stored to descriptor that has following structure:
+// xxx:yyy where
+//
+//  xxx tells variable type of a setting. Possible values are "des" for
+//  descriptor, "int" for integer and "boo" for boolean. Variable is stored to
+//  3 characters.
+//
+//  ":" separates variable type information from it's value. Separation character
+//  takes one character.
+//
+//  yyy stores value of a setting. For setting has been reserved 256 characters.
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::DecodeSettingL( const TDesC& aIn, TAccModeSetting& aOut ) const
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::DecodeSettingL()" );
+
+    TAccModeSettingType type( EAccModeSettingNotSet );
+
+    // check variable type
+    if( aIn.Find( KAccSettingInteger ) == 0 )
+        {
+        type = EAccModeSettingInt;
+        }
+    else if( aIn.Find( KAccSettingBoolean ) == 0 )
+        {
+        type = EAccModeSettingBool;
+        }
+    else if( aIn.Find( KAccSettingDescriptor ) == 0 )
+        {
+        type = EAccModeSettingDes;
+        }
+
+    // get data out
+    HBufC* data = HBufC::NewL( aIn.Length() - KAccSettingIdLength );
+    data->Des().Copy( aIn.Mid( KAccSettingIdLength ) );
+
+    // store value for client
+    switch ( type )
+        {
+        case EAccModeSettingInt:
+            {
+            TLex temp( *data );
+            TInt value( 0 );
+            temp.Val( value );
+            aOut.SetTInt( value );
+            }
+            break;
+
+        case EAccModeSettingBool:
+            {
+            TLex temp( *data );
+            TInt value( 0 );
+            temp.Val( value );
+            aOut.SetTBool( static_cast< TBool >( value ) );
+            }
+            break;
+
+        case EAccModeSettingDes:
+            {
+            aOut.SetTDes( *data );
+            }
+            break;
+
+        default:
+            {
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::DecodeSettingL() value was not set !" );
+            delete data;
+            User::Leave( KErrNotFound );
+            }
+            break;
+        }
+
+    delete data;
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::DecodeSettingL() return" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::StaticKey
+//
+// Returns ETrue, if id is static key. Settings stored with static key have some
+// influence to Accessory Server's behaviour.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CAccSrvSettingsHandler::StaticKey( const TInt id ) const
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::StaticKey(%d)", id );
+
+    TBool identified( EFalse );
+
+    switch ( id )
+        {
+        case KAccServerWiredHSLights:
+        case KAccServerWirelessHSLights:
+        case KAccServerWiredCarKitLights:
+        case KAccServerWirelessCarKitLights:
+        case KAccServerTextDeviceLights:
+        case KAccServerLoopsetLights:
+        case KAccServerMusicStandLights:
+        case KAccServerSyncStandLights:
+            identified = ETrue;
+            break;
+
+        default:
+            break;
+        }
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::StaticKey() returns %d", identified );
+    return identified;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvSettingsHandler::GetStaticKeys
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvSettingsHandler::GetStaticKeys(
+                    const TAccMode aAccMode,
+                    RArray< TUint32 >& aArray ) const
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvSettingsHandler::GetStaticKeys(%d)", aAccMode );
+
+    switch( aAccMode )
+        {
+        case EAccModeWiredHeadset:
+            aArray.Append( KAccServerWiredHSLights );
+            break;
+        case EAccModeWirelessHeadset:
+            aArray.Append( KAccServerWirelessHSLights );
+            break;
+        case EAccModeWiredCarKit:
+            aArray.Append( KAccServerWiredCarKitLights );
+            break;
+        case EAccModeWirelessCarKit:
+            aArray.Append( KAccServerWirelessCarKitLights );
+            break;
+        case EAccModeTextDevice:
+            aArray.Append( KAccServerTextDeviceLights );
+            break;
+        case EAccModeLoopset:
+            aArray.Append( KAccServerLoopsetLights );
+            break;
+        case EAccModeMusicStand:
+            aArray.Append( KAccServerMusicStandLights );
+            break;
+        default:  // mode is not supported
+            break;
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvSettingsHandler::GetStaticKeys() returns" );
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+//  End of File