/*
* Copyright (c) 2006-2007 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:  Class implementing SIP profile model.
*  Version     : %version: 5.1.6 % << Don't touch! Updated by Synergy at check-out.
*
*/



#ifndef C_MUSSIPPROFILEMODEL_H
#define C_MUSSIPPROFILEMODEL_H


#include "mmussipprofilehandler.h"
#include <e32base.h>
#include <sipmanagedprofile.h>
#include <gsplugininterface.h>
#include <sipprofileregistryobserver.h>


class CSIPManagedProfileRegistry;


/**
 *  CMusSIPProfileModel model class.
 *  Model class implementing SIP profile model.
 *
 *  @since S60 v3.2
 */
class CMusSIPProfileModel
    :public CBase,
     public MSIPProfileRegistryObserver,
	 public MMusSIPProfileHandler
	 {
public:

    static CMusSIPProfileModel* NewL();

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

public: // From base class MMusSIPProfileHandler.

    /**
     * From MMusSIPProfileHandler.
     * Returns the index of the default SIP profile.
     * @return KErrNotFound, if one does not exist, otherwise index of the
     *         default SIP profile.
     */
    virtual TInt DefaultProfileIndex();

    /**
     * From MMusSIPProfileHandler.
     * Returns the id of the default SIP profile.
     * @return KErrNotFound, if one does not exist, otherwise id of the
     *         default SIP profile.
     */
	virtual TUint32 DefaultProfileId();
	
	
	/*
	 * 
	 * 
	 */
	virtual void DisableProfileL();
	
	/*
     * 
     * 
     */
	virtual void EnableProfileL();
	
	/*
     * 
     * 
     */
	virtual TBool ProfileEnabledL();

    /**
     * From MMusSIPProfileHandler.
     * Returns SIP profile index on locally cached array based on id.
     * @param aId Profile id
     * @return Profile index or KErrNotFound if no matching profile is found.
     */
    virtual TInt ProfileIndexByIdL( TUint32 aId );

    /**
     * From MMusSIPProfileHandler.
     * Returns profile id based on index.
     * @param aIndex Profile index
     * @return Profile id or KUnknownProfileId if no matching profile is found.
     */
    virtual TUint32 ProfileIdByIndex( TUint aIndex );

    /**
     * From MMusSIPProfileHandler.
     * Returns pointer to the SIP profile array, does not change ownership.
     * Note that previously returned value goes out of scope after a new
     * call to ProfileArrayL. So it is not advised to store return value
     * in long persistent variable, but rather to be used like stack
     * variables for safety.
     *
     * @return Pointer to internally cached SIP profile array.
     */
    virtual CArrayPtr<CSIPManagedProfile>* ProfileArrayL();

public: // From base class MSIPProfileRegistryObserver.

    /**
     * From MSIPProfileRegistryObserver.
     * SIP profile information event.
     * @param aProfileId Id of SIP profile in question.
     * @param aEvent Type of information event.
	 */
	virtual void ProfileRegistryEventOccurred(
	    TUint32 aSIPProfileId,
	    TEvent aEvent );

	/**
     * From MSIPProfileRegistryObserver.
	 * An asynchronous error has occurred related to SIP profile.
     * @param aSIPProfileId Id of the failed profile.
	 * @param aError An error code.
	 */
	virtual void ProfileRegistryErrorOccurred(
	    TUint32 aSIPProfileId,
	    TInt aError );

protected:

    /**
     * Reads the profile array from SIP Profile Client.
     */
    void ReadArrayFromEngineL();

    /**
     * Sorts internal array of SIP profiles by id.
     */
    void SortProfilesL();

    /**
     * Deletes internally cached profiles.
     */
    void DeleteProfiles();

    /**
     * Reads profile list from the engine; if reading fails,
     * keeps the old list safe.
     */
    void ReadProfileListFromEngineSafeL();

private:

    CMusSIPProfileModel();

    void ConstructL();

    /**
     * For deleting RPointerArray in case of leave.
     */
    static void ResetAndDestroy( TAny* aPointerArray );

private: // data

    /**
     * Instance of the SIP profile registry engine for managing SIP profiles.
     * Own.
     */
    CSIPManagedProfileRegistry* iEngine;

    /**
     * Locally cached array of SIP profiles.
     * Own.
     */
    CArrayPtrFlat<CSIPManagedProfile>* iProfiles;

    };

#endif // C_MUSSIPPROFILEMODEL_H
