/*
* Copyright (c) 2007-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:   Definition of the class which handles handover triggering.
*
*/



#ifndef C_VCCHOTRIGGER_H
#define C_VCCHOTRIGGER_H


#include <e32base.h>
#include <e32std.h>
#include <wlanmgmtcommon.h>

#include "vccsignallevelobserver.h"
#include "vcccchobserver.h"
#include "vcchopolicy.h"
#include "vccunittesting.h"

class CVccUiPsProperty;
class CVccWlanSignalLevelHandler;
class CVccGsmSignalLevelHandler;
class CVccHoPolicyReader;
class CVccCchMonitor;
class CVccEngPsProperty;
class CVccPerformer;

/**
 *  This class handles the triggering of the handover from
 *  one network to another.
 *
 *
 *  @code
 *   CMyClass::ConstructL()
 *       {
 *       iHoTrigger = CVccHoTrigger::NewL();
 *       }
 *
 *   CMyClass::FunctionL()
 *       {
 *       iHoTrigger->Start();
 *       }
 *
 *   CMyClass::DomainChanged()
 *       {
 *       // Use swapped the domain of an active call
 *       iHoTrigger->SetCurrentDomain( iActiveCallDomain );
 *       }
 *
 *   CMyClass::CallPutToHold()
 *       {
 *       // Stop all network monitoring.
 *       iHoTrigger->Stop();
 *       }
 *
 *   CMyClass::CallActivated()
 *       {
 *       // Start all network monitors
 *       iHoTrigger->Start();
 *       }
 *
 *   CMyClass::~CMyClass()
 *       {
 *       delete iHoTrigger;
 *       }
 *
 *  @endcode
 *
 *  @lib vcchotrigger.lib
 *  @since S60 v3.2
 */
class CVccHoTrigger : public CBase,
                      public MVccSignalLevelObserver,
                      public MVccCchObserver
    {

public:


    /** Domain types */
    enum TCallDomainType
        {
        /** PS domain */
        ECallDomainTypePS,
        /** CS domain */
        ECallDomainTypeCS
        };


    /**
     * Two-phased constructor.
     */
    IMPORT_C static CVccHoTrigger* NewL();

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


    /**
     * Stop all network monitors
     *
     * @since S60 v3.2
     */
    IMPORT_C void Stop();
    
    /**
     * Stop all network monitors
     *
     * @since S60 v3.2
     */
    IMPORT_C void Stop( CVccPerformer& aStopper );

    /**
     * Start all network monitors
     *
     * @since S60 v3.2
     */
    IMPORT_C void Start( CVccPerformer& aWhoStartedMe, TBool aCsOriginated );

    /**
     * Set the current domain of the active call
     *
     * @since S60 v3.2
     * @param aDomainType is the domain of the current (active) call.
     */
    IMPORT_C void SetCurrentDomainType( TCallDomainType aDomainType );

    /**
     * Set the preferred domain of the active call
     * 
     * @since S60 v3.2
     * @param aDomainType is the callīs preferred domain type.
     */
    IMPORT_C void SetPreferredDomainType( TVccHoPolicyPreferredDomain aDomainType );

    
    /**
     * Set immediate domain transfer setting
     * 
     * @since S60 v3.2
     * @param aDomainType is the callīs preferred domain type.
     */
    IMPORT_C void SetImmediateDomainTransfer( TBool aImmediateDT );
        
// from base class MVccSignalLevelObserver

    /**
     * @see MVccSignalLevelObserver::WlanSignalChanged()
     */
    void WlanSignalChanged( TInt32 aSignalStrength,
            TSignalStrengthClass aClass );

    /**
     * @see MVccSignalLevelObserver::GsmSignalChanged()
     */
    void GsmSignalChanged( TInt32 aSignalStrength,
            TSignalStrengthClass aClass );

// from base class MVccCchMonitorObserver

    /**
     * @see MVccCchMonitorObserver::CchServiceStatusChanged
     */
    void CchServiceStatusChanged( TServiceStatus aStatus );
    
public:
    /**
     * When manual handover is started no automatic handovers should
     * be made.
     *
     * @since S60 3.2
     */
    IMPORT_C void ManualHoCallStarted();

    /**
     * After manual handover call has been released, automatic
     * handovers can be made again.
     *
     * @since S60 3.2
     */
    IMPORT_C void ManualHoCallReleased();

    /**
     * During conference call HO is not allowed
     *
     * @since S60 3.2
     */
    IMPORT_C void HoNotAllowedL();
    
    /**
     * After conference call HO is allowed again
     *
     * @since S60 3.2
     */
    IMPORT_C void HoAllowed();
    
    /**
     * Reads the settings to get the info if ho is allowed when cs originated call
     * @since s60 3.2
     */
    IMPORT_C void ReadHoAllowedWhenCsOriginatedSettingL();
    
private:

    /**
     * C++ constructor
     *
     * @since S60 v3.2
     */
    CVccHoTrigger();

    /**
     * Symbian second-phase constructor
     *
     * @since S60 v3.2
     */
    void ConstructL();
    
    /**
     * Check if PS or CS are available (to do handover).
     * 
     * @since S60 v3.2
     * @return ETrue if service is available, else return EFalse
     */
    TBool ServicesAvailable();
    
    /**
     * Update (write) service status state to P&S.
     * 
     * @since S60 v3.2
     */
    void UpdatePsKeysL();

    /**
     * Initiates the actual handover if its ok to start ho.
     * 
     * @since S60 v3.2
     */
    void TriggerHo();
    
    /**
     * Initiate immediate ho.
     * 
     * @since S60 v3.2
     * @return ETrue if immediate HO was initiated, EFalse otherwise
     */
    TBool DoImmediateHo();

private: // data


    /**
     * VCC P&S key manager for UI side
     * Own.
     */
    CVccUiPsProperty* iProperty;
    
    /**
     * PS property writer to write TVccHoStatus values
     * Own.
     */
    CVccEngPsProperty* iEngPsProperty;

    /**
     * VCC Wlan signal level observer
     * Own.
     */
    CVccWlanSignalLevelHandler* iWlanSignalLevelHandler;

    /**
     * VCC GSM signal level observer
     * Own.
     */
    CVccGsmSignalLevelHandler* iGsmSignalLevelHandler;

    /**
     * Call domain type
     */
    TCallDomainType iDomainType;


    /**
     * GSM signal class
     */
    TSignalStrengthClass iGsmClass;

    /**
     * Previous GSM signal class
     */
    TSignalStrengthClass iPreviousGsmClass;
    
    /**
     * WLAN signal class.
     */
    TSignalStrengthClass iWlanClass;
    
    /**
     * Previous WLAN signal class.
     */
    TSignalStrengthClass iPreviousWlanClass;
    
    /**
     * CenRep reader for VCC HO policy
     * Own.
     */
    CVccHoPolicyReader* iHoPolicyReader;
    
    /** VCC HO policy */
    TVccHoPolicy iPolicy;
    
    /**
     * CCH monitor.
     * Own
     */
    CVccCchMonitor* iCchMonitor;
    
    /**
     * CCH status (PS service availability)
     */
    MVccCchObserver::TServiceStatus iCchServiceStatus;
    
    /**
     * CS status (i.e. signal level)
     */
    TInt iCsSignalLevel;
    
    /**
     * Are we stopped or active (i.e. monitoring)
     */
    TBool iStarted;
    
    /**
     * Has manual ho been made
     */
    TBool iManualHoDone;
    
    /**
     * Ho allowed or not (conference, video, data, multimedia sharing)
     */
    TBool iHoNotAllowed;
    
    /**
     * Performer that started trigger
     * Not own.
     */
    CVccPerformer* iWhoStartedMe;
    
    /*
     * Is ho allowed if the originating domain of the 
     * original call was CS
     */
    TBool iHoAllowedIfCsOriginated;
    
    friend class T_CVccPerformer;
    
    VCC_UNITTEST( UT_CVccHoTrigger )
    };

#endif //  C_VCCHOTRIGGER_H
