systemsettings/GSAccessoryPlugin/src/gsaccessorypluginmodel.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/systemsettings/GSAccessoryPlugin/src/gsaccessorypluginmodel.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,378 @@
+/*
+* Copyright (c) 2005-2009 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:  Implementation of CGSAccessoryPluginModel class
+*
+*/
+
+
+#include <centralrepository.h>
+#include <featmgr.h>
+#include <HWRMDomainCRKeys.h> // HAC feature
+#include <ProfileEngineDomainCRKeys.h> // HAC feature
+#include <accessoriescrkeys.h>
+
+#include "gsaccessoryplugin.hrh"
+#include "gsaccessorypluginconst.hrh"
+#include "gsaccessorypluginmodel.h"
+#include "gsaccprofilelist.h"
+#include "trace.h"
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::NewL
+// ---------------------------------------------------------------------------
+//
+CGSAccessoryPluginModel* CGSAccessoryPluginModel::NewL()
+    {
+    CGSAccessoryPluginModel* self = new( ELeave ) CGSAccessoryPluginModel;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::~CGSAccessoryPluginModel
+// ---------------------------------------------------------------------------
+//
+CGSAccessoryPluginModel::~CGSAccessoryPluginModel()
+    {
+    FUNC_LOG;
+
+    delete iProfileList;
+    delete iAccessoryRepository;
+    delete iHwSettingsRepository;
+    delete iProfVariationRepository;
+    delete iProfileRepository;
+    iAccessorySettings.CloseSubSession();
+    iAccServer.Disconnect();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::AccessorySupportedL
+// ---------------------------------------------------------------------------
+//
+TBool CGSAccessoryPluginModel::AccessorySupportedL( TInt aAccessory ) const
+    {
+    FUNC_LOG;
+
+    TBool supported( EFalse );
+    switch ( aAccessory )
+        {
+        case EGSHeadset:    // Fall through
+        case EGSHeadphones: // Fall through
+        case EGSMusicStand:
+            supported = ETrue;
+            break;
+        case EGSWiredCarkit:
+            User::LeaveIfError( iAccessoryRepository->Get(
+                KSettingsAccWiredCarkitSupported, supported ) );
+            break;
+        case EGSWirelessCarkit:
+            User::LeaveIfError( iAccessoryRepository->Get(
+                KSettingsAccWirelessCarkitSupported, supported ) );
+            break;
+        case EGSTvout:
+            supported = FeatureManager::FeatureSupported( KFeatureIdTvOut );
+            break;
+        case EGSLoopset:
+            User::LeaveIfError( iAccessoryRepository->Get(
+                KSettingsAccLoopsetSupported, supported ) );
+            break;
+        case EGSTextPhone:
+            supported = FeatureManager::FeatureSupported( KFeatureIdPhoneTty );
+            break;
+        case EGSHac:
+            {
+            TInt localFeatures( 0 );
+            User::LeaveIfError( iProfVariationRepository->Get(
+                KProEngTonesViewLVFlags, localFeatures ) );
+            supported = localFeatures & KTonesViewFeatureIdHac;
+            }
+            break;
+        default:
+            break;
+        }
+
+    INFO_2( "Accessory %d support status = %d", aAccessory, supported );
+    return supported;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::DefaultAccessory
+// ---------------------------------------------------------------------------
+//
+TInt CGSAccessoryPluginModel::DefaultAccessory() const
+    {
+    FUNC_LOG;
+
+    TUint32 value( 0 );
+    TInt error = iAccessorySettings.GetHWDeviceSettings( value );
+    ERROR( error, "Failed to get default accessory" );
+    return ( error == KErrNone ? value : error );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::SetDefaultAccessory()
+// ---------------------------------------------------------------------------
+//
+void CGSAccessoryPluginModel::SetDefaultAccessoryL( TInt aValue )
+    {
+    FUNC_LOG;
+
+    iAccessorySettings.SetHWDeviceSettingsL( aValue );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::DefaultProfileByKey
+// ---------------------------------------------------------------------------
+//
+TInt CGSAccessoryPluginModel::DefaultProfileByKey( TInt aKey ) const
+    {
+    FUNC_LOG;
+
+    // Feature flagging should be checked in the UI for configurable accessories.
+    TInt profile( 0 );
+    TInt error = iProfileRepository->Get( aKey, profile );
+    ERROR_1( error, "Failed to read key %d value from profile repository", aKey );
+    INFO_2( "Default profile key %d value is %d", aKey, profile );
+    return ( error == KErrNone ? profile : error );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::SetDefaultProfileByKeyL
+// ---------------------------------------------------------------------------
+//
+void CGSAccessoryPluginModel::SetDefaultProfileByKeyL(
+    TInt aKey,
+    TInt aNewProfile )
+    {
+    FUNC_LOG;
+
+    User::LeaveIfError( iProfileRepository->Set( aKey, aNewProfile ) );
+    INFO_2( "Default profile key %d set to %d", aKey, aNewProfile );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::AutoAnswerModeByKey
+// ---------------------------------------------------------------------------
+//
+TInt CGSAccessoryPluginModel::AutoAnswerModeByKey( TInt aKey ) const
+    {
+    FUNC_LOG;
+
+    TInt mode;
+    TInt error = iAccessoryRepository->Get( aKey, mode );
+    ERROR_1( error, "Failed to read key %d value from accessory repository", aKey );
+    INFO_2( "Auto answer mode key %d value is %d", aKey, mode );
+    if ( error == KErrNone )
+        {
+        return ( mode == 1 ? KIndexOn : KIndexOff ); // Map to list box indexes
+        }
+    return error;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::SetAutoAnswerModeByKeyL
+// ---------------------------------------------------------------------------
+//
+void CGSAccessoryPluginModel::SetAutoAnswerModeByKeyL(
+    TInt aKey,
+    TInt aMode ) const
+    {
+    FUNC_LOG;
+
+    TInt val = ( aMode == KIndexOn ? 1 : 0 );
+    INFO_1( "Setting automatic answer mode to %d", val );
+    TInt error = iAccessoryRepository->Set( aKey, val );
+    ERROR( error, "Failed to set automatic answer mode" );
+    User::LeaveIfError( error );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::LightModeL
+// ---------------------------------------------------------------------------
+//
+TInt CGSAccessoryPluginModel::LightMode(
+    TAccMode aAccMode,
+    TInt aAccSetId ) const
+    {
+    FUNC_LOG;
+
+    TAccModeSetting setting;
+    setting.SetId( aAccSetId );
+
+    TInt error = iAccessorySettings.GetAccessoryModeSetting( aAccMode, setting );
+    ERROR_2( error, "Failed to read mode for accessory %d setting %d", aAccMode, aAccSetId );
+
+    TInt mode( KErrNone );
+    setting.GetTInt( mode );
+
+    if ( error == KErrNone )
+        {
+        return ( mode == EAccLightsOn ? KIndexOn : KIndexAuto ); // Map to list box indexes
+        }
+    return error;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::SetLightModeL
+// ---------------------------------------------------------------------------
+//
+void CGSAccessoryPluginModel::SetLightModeL(
+    TAccMode aAccMode,
+    TInt aAccSetId,
+    TInt aLightMode )
+    {
+    FUNC_LOG;
+
+    TAccModeSetting setting;
+    setting.SetId( aAccSetId );
+    TInt val = ( aLightMode == KIndexOn ? EAccLightsOn : EAccLightsAutomatic );
+    INFO_3( "Setting light mode for accessry %d setting %d to %d", aAccMode, aAccSetId, val );
+    setting.SetTInt( val );
+    iAccessorySettings.SetAccessoryModeSettingL( aAccMode, setting );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::HacMode()
+// ---------------------------------------------------------------------------
+//
+TInt CGSAccessoryPluginModel::HacMode()
+    {
+    FUNC_LOG;
+
+    TInt mode;
+    TInt error = iHwSettingsRepository->Get( KHWSettingsHearingAidMode, mode );
+    ERROR( error, "Failed to read HAC mode" );
+    INFO_1( "HAC mode = %d", mode );
+    if ( error == KErrNone )
+        {
+        return ( mode == 1 ? KIndexOn : KIndexOff ); // Map to list box indexes
+        }
+    return error;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::SetHACModeL()
+// ---------------------------------------------------------------------------
+//
+void CGSAccessoryPluginModel::SetHacModeL( TInt aMode )
+    {
+    FUNC_LOG;
+
+    TInt val = ( aMode == KIndexOn ? 1 : 0 );
+    INFO_1( "Setting HAC mode to %d", val );
+    TInt error = iHwSettingsRepository->Set( KHWSettingsHearingAidMode, val );
+    ERROR( error, "Failed to set HAC mode" );
+    User::LeaveIfError( error );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::PalmSupport
+// ---------------------------------------------------------------------------
+//
+TBool CGSAccessoryPluginModel::PalmSupport()
+    {
+    return iPalmSupport;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::ProfileList
+// ---------------------------------------------------------------------------
+//
+CGSAccProfileList& CGSAccessoryPluginModel::ProfileList() const
+    {
+    return *iProfileList;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::FlipValue
+// ---------------------------------------------------------------------------
+//
+void CGSAccessoryPluginModel::FlipValue( TInt& aValue )
+    {
+    FUNC_LOG;
+
+    if ( aValue == 0 )
+        {
+        aValue = 1;
+        }
+    else
+        {
+        aValue = 0;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::CGSAccessoryPluginModel
+// ---------------------------------------------------------------------------
+//
+CGSAccessoryPluginModel::CGSAccessoryPluginModel()
+    {
+    FUNC_LOG;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSAccessoryPluginModel::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CGSAccessoryPluginModel::ConstructL()
+    {
+    FUNC_LOG;
+
+    iAccessoryRepository = CRepository::NewL( KCRUidAccessorySettings );
+    iProfileRepository = CRepository::NewL( KCRUidProfileSettings );
+    iHwSettingsRepository = CRepository::NewL( KCRUidHWSettings );
+    iProfVariationRepository = CRepository::NewL( KCRUidProfilesLV );
+    iPalmSupport = EFalse;
+
+    CRepository* tvRepository = CRepository::NewL( KCRUidTvoutSettings );
+    CleanupStack::PushL( tvRepository );
+    tvRepository->Get( KSettingsTvoutPalmVisibility, iPalmSupport ); // Ignore error
+    CleanupStack::PopAndDestroy( tvRepository );
+
+    iProfileList = CGSAccProfileList::NewL();
+
+    // connect to Accessory server
+    TInt error = iAccServer.Connect();
+    ERROR( error, "Failed to connect to Accessory Server" );
+    if ( !error )
+        {
+        // create a session to accessory settings
+        error = iAccessorySettings.CreateSubSession( iAccServer );
+        ERROR( error, "Failed to create Accessory Settings subsession" );
+        }
+
+    User::LeaveIfError( error );
+    }
+