/*
* Copyright (c) 2002-2006 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.
*
*/


#ifndef CACCSRVSETTINGSHANDLER_H
#define CACCSRVSETTINGSHANDLER_H

//  INCLUDES
#include <e32base.h>
#include <AccModeSettingArray.h>
#include "AccSrvServerModel.h"

// CONSTANTS
_LIT_SECURITY_POLICY_C1(KNoCapability, ECapability_None);
_LIT_SECURITY_POLICY_C1(KWriteDeviceDataPolicy, ECapabilityWriteDeviceData);
    
// MACROS

// DATA TYPES
enum TAccSettingsLights
    {
    EAccSettingsLightsNotSet,
    EAccSettingsLightsOff,
    EAccSettingsLightsOn
    };

// FUNCTION PROTOTYPES

// FORWARD DECLARATIONS
class CAccSrvConnectionController;
class CHWRMLight;

// CLASS DECLARATION

/**
*  Controller for accessory settings functionality.
*
*  @lib AccServer
*  @since S60 3.1
*/
NONSHARABLE_CLASS( CAccSrvSettingsHandler ) : public CBase
    {
    public:  // Constructors and destructor

        /**
        * Two-phased constructor.
        */
        static CAccSrvSettingsHandler* NewL( CAccSrvConnectionController* aConCtrl,
                                             CAccSrvServerModel& aModel );

        /**
        * Destructor.
        */
        virtual ~CAccSrvSettingsHandler();

    public: // New functions

        /**
        * Should be called to indicate settings handler that connection status
        * has changed.
        *
        * @since S60 3.1
        * @param aArray list of ids representing current connection status
        * @return void
        */
        void ConnectionStatusChangedL( TAccPolGenericIDArray& aArray );

        /**
        * Returns all supported HW devices that can't be properly identified
        * when they are connected to phone without additional information.
        *
        * @since S60 3.1
        * @param void
        * @return supported HW devices in a bit mask
        */
        TUint32 GetSupportedHWDevicesL() const;

        /**
        * Sets or removes HW devices. Used to identify HW device properly when
        * it's connected to phone.
        *
        * @since S60 3.1
        * @param    aSettings   Bit mask storing one or several HW devices.
        *             See AccessoryTypes.h for HW device bit mask
        *             definitions.
        * @param    aEnable   ETrue: sets HW device. EFalse: removes HW device.
        * @param    aForce    Reserved for future use.
        * @return     void
        * @exception  KErrArgument if an argument was invalid or system-wide
        *       error code if failed.
        */
        void SetHWDeviceSettingsL( TUint32 aSettings,
                                   TBool aEnable,
                                   TBool aForce ) const;

        /**
        * Returns current HW devices.
        *
        * @since S60 3.1
        * @param void
        * @return HW devices in a bit mask.
        */
        TUint32 GetHWDeviceSettings() const;

        /**
        * Sets one setting for specified accessory mode.
        *
        * @since S60 3.1
        * @param aAccMode   Defines an accessory mode.
        * @param aSetting   Defines setting and it's value.
        * @return void
        * @exception system-wide error code if failed.
        */
        void SetAccessoryModeSettingL( const TAccMode aAccMode,
                                       const TAccModeSetting& aSetting) const;

        /**
        * Returns one setting for specified accessory mode.
        *
        * @since S60 3.1
        * @param  aAccMode  Defines an accessory mode.
        * @param  aSetting  Defines setting and it's value.
        * @return void
        * @exception system-wide error code if failed.
        */
        void GetAccessoryModeSettingL( const TAccMode aAccMode,
                                       TAccModeSetting& aSetting ) const;

        /**
        * Sets several settings for specified accessory mode.
        *
        * @since S60 3.1
        * @param aAccMode   Defines an accessory mode.
        * @param aArray   Defines an array of several setting and value
        *         pairs.
        * @return void
        * @exception system-wide error code if failed.
        */
        void SetAccessoryModeSettingsL( const TAccMode aAccMode,
                                        const TAccModeSettingArray& aArray ) const;

        /**
        * Returns all settings for specified accessory mode.
        *
        * @since S60 3.1
        * @param aAccMode   Defines accessory mode.
        * @param aArray   Defines an array of several setting and value
        *         pairs.
        *
        * @return void
        * @exception system-wide error code if failed.
        */
        void GetAccessoryModeSettingsL( const TAccMode aAccMode,
                                        TAccModeSettingArray& aArray ) const;

    public: // Functions from base classes

    protected:  // New functions

    protected:  // Functions from base classes

    private:

        /**
        * C++ default constructor.
        */
        CAccSrvSettingsHandler( CAccSrvConnectionController* aConCtrl,
                                CAccSrvServerModel& aModel );

        /**
        * By default Symbian 2nd phase constructor is private.
        */
        void ConstructL();

        /**
        * Returns new settings value. Leaves, if new settings contradict with
        * policy.
        */
        TUint32 ResolveNewSettingsL( TUint32 aSettings,
                                     TBool aEnable,
                                     TBool aForce ) const;

        /**
        * Checks whether vibra can be allowed or not. As a result aVibra will
        * be modified: aVibra = ETrue   -> vibra is allowed,
        *              aVibra = EFalse  -> vibra isn't allowed
        */
        void GetVibraAllowed( TAccPolGenericID& aId,
                               TBool& aVibra ) const;

        /**
        * Checks whether lights are forced on or not. As a result aLights will
        * be modified: aLights = ETrue   -> lights should be put on,
        *              aLights = EFalse  -> lights shouldn't be put on
        */
        void GetLightsAllowedL( TAccPolGenericID& aId,
                                TBool& aLights ) const;

        /**
        * Creates CR key dynamically.
        */
        TUint32 CreateCRKeyL( const TAccMode aAccMode, const TInt aId ) const;

        /**
        * Converts setting from client format to CR format.
        */
        HBufC* CodeSettingL( const TAccModeSetting& aSetting ) const;

        /**
        * Converts setting from CR format to format readable by client.
        */
        void DecodeSettingL( const TDesC& aIn, TAccModeSetting& aOut ) const;

        /**
        * Returns ETrue, if setting is known.
        */
        TBool StaticKey( const TInt id ) const;

        /**
        * Returns all static keys for accessory mode.
        */
        void GetStaticKeys( const TAccMode aAccMode,
                   RArray< TUint32 >& aArray ) const;

    public:     // Data

    protected:  // Data

    private:    // Data
        // Controls connection handling
        CAccSrvConnectionController* iConCtrl;

        // Model that stores server status when server is running
        CAccSrvServerModel& iModel;

        // Lights API services
        CHWRMLight* iLightsApi;

        // Tells wheter lights set on or off by accessory server.
        TAccSettingsLights iLightsOn;

    public:     // Friend classes

    protected:  // Friend classes

    private:    // Friend classes

    };

#endif      // CACCSRVSETTINGSHANDLER_H

// End of File
