/*
* 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:  This file contains the header file of the CPECallHandling class.
*
*/


#ifndef CPECALLHANDLING_H
#define CPECALLHANDLING_H

//INCLUDES
#include <etel.h>
#include <etelmm.h>
#include <ccce.h>
#include <pevirtualengine.h>
#include <mpemessagesender.h>
#include <mccedtmfinterface.h>
#include "mpecallinitialiser.h"
#include <mpecallhandling.h>

// CONSTANTS
// None.

// MACROS
// None.

// DATA TYPES
// None.

// FUNCTION PROTOTYPES
// None.

// FORWARD DECLARATIONS
class CPEVideoCallHandling;
class MPEPhoneModelInternal;
class CPELine;
class CPEDtmfHandling;
class CPESingleCall;
class CPEConferenceCall;
class CPESupplementaryServicesMonitor;
class CPECallArrayOwner;
class CPsetSAObserver;
class CCCECallParameters;
class CPECCEObserver;
class CPESystemCallState;
class CRepository;

// CLASS DECLARATION

/**
* CPECallHandling Handles voice call related events from phone engine.
*
*  @lib callhandling.lib
*  @since Series60_4.0
*/
class CPECallHandling 
        : public CBase, 
          public MPEMessageSender,
          public MPECallHandling,
          public MPECallInitialiser
    {
    public: //Constructors and descructor
        /**
        * Two-phased constructor.
        */
        IMPORT_C static CPECallHandling* NewL( MPEPhoneModelInternal& aModel, 
            CCCE& aConvergedCallEngine,
            MCCEDtmfInterface& aDtmfInterface );

        /**
        * Destructor.
        */
        IMPORT_C virtual ~CPECallHandling();

    protected:  // Constructors and destructor
        /**
        * C++ default constructor.
        */
        CPECallHandling( MPEPhoneModelInternal& aModel,
            CCCE& aConvergedCallEngine,
            MCCEDtmfInterface& aDtmfInterface );

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

    public: // From MPEMessageSender
    
        /**
        * Reroutes error message to Phone Engine, usable by call objects
        * @param aCallId Identification number of the call.
        * @param aErrorCode, the error code stored after previous unsuccessful request
        */
        void SendErrorMessage( 
            const TInt aCallId, 
            const TInt aErrorCode );
        
        /**
        * Reroutes messages to Phone Engine, usable by call objects
        * @param aMessage Message id.
        * @param aCallId Identification number of the call.
        */
        void SendMessage( 
            const MEngineMonitor::TPEMessagesFromPhoneEngine aMessage, 
            const TInt aCallId );
            
        /**
        * Reroutes call messages
        * @param aMessage The message code of the message
        * @param aName Name of call fill be maped to call id
        */  
        void SendMessage( 
            const MEngineMonitor::TPEMessagesFromPhoneEngine aMessage,
            const TName& aName );
        
        /**
         * Reroutes call messages.
         * @param aMessage specifies the event that has taken place
         */
        void HandleInternalMessage(
            TInt aMessage );

    public: // From MPEMonitorCommandOwner
        /**
        * Reroutes error messages to Phone Engine, usable by other than call objects
        * @param aErrorCode, the error code stored after previous unsuccessful request
        */
        void SendErrorMessage( 
            const TInt aErrorCode );

        /**
        * Reroutes messages to Phone Engine, usable by other than call objects
        * @param aMessage The message code of the message
        */    
        void SendMessage( 
            const MEngineMonitor::TPEMessagesFromPhoneEngine aMessage );

    public: // From MPECallHandling
        /**
        * Starts monitoring incoming calls for voice and data call.
        */
        IMPORT_C void StartUp();

        /**
        * Makes answer request to the Multimode ETel. 
        * @since Series60_4.0
        * @param None.
        * @return Error code.
        */
        IMPORT_C TInt AnswerCall();

        /**
        * Creates dialing request to the Multimode ETel. 
        * @since Series60_4.0
        * @param aNumber The telephone number to be called.
        * @param aCallId Identification number of the call.
        * @return Error (KErrNone is success).
        */
        IMPORT_C TInt DialCall( const TPEPhoneNumber& aNumber,TInt& aCallId );

        /**
        * Creates dialing request to the Multimode ETel. 
        * @since Series60_4.0
        * @param aNumber The telephone number to be called.
        * @param aCallId Identification number of the call.
        * @return Error (KErrNone is success).
        */
        IMPORT_C TInt DialMultimedia( const TPEPhoneNumber& aNumber,TInt& aCallId );

        /**
        * Returns call duration time.
        * @since Series60_4.0
        * @param aDuration Call duration.
        * @param aCallId Identification number of the call.
        * @return Error code (KErrNone or KErrNotFound).
        */    
        IMPORT_C TInt GetCallDuration( TTimeIntervalSeconds& aDuration, TInt aCallId );

        /**
        * Returns information of the call.
        * @since Series60_4.0
        * @param aCallInfo Current call information.
        * @param aCallId Identification number of the call.
        * @return Error code (KErrNone or KErrNotFound).
        */
        IMPORT_C  TInt GetCallInfo( 
            RMobileCall::TMobileCallInfoV3& aCallInfo, 
            TInt aCallId );

        /**
        * Returns state of the call.
        * @since Series60_4.0
        * @param aCallid Identification number of the call.
        * @return Call state ( EPEStateUnknown is error).
        */
        IMPORT_C TPEState GetCallState( TInt aCallId );

        /**
        * Returns the missed voice call indicator. 
        * @since Series60_4.0
        * @param  aMissedCall, missed call indicator.
        * @param aCallId, call idendificator.
        * @return KErrNone or KErrNotFound.
        */
        IMPORT_C TInt GetMissedCall( TBool& aMissedCall, TInt aCallId );

        /**
        * Returns number of non-idle calls
        * @since Series60_4.0
        * @param  None.
        * @return Number of current voice calls.
        */
        IMPORT_C TInt GetNumberOfCalls();

        /**
        * Returns remote alerting tone status (is it played by network or not).
        * @since Series60_4.0
        * @param aToneStatus Status of remote alerting tone play.
        * @return None.
        */
       /* IMPORT_C void GetRemoteAlertingToneStatus( 
            RMmCustomAPI::TRemoteAlertingToneStatus& aToneStatus );*/
        
        /**
        * Makes HangUp request to the CCE. 
        * @since Series60_4.0
        * @param aCallId Identification number of the call to be rejected.
        * @param aAutoResumeOption if options for autoresume.
        * @return Error (KErrNone is success).
        */
        IMPORT_C TInt HangUp( TInt aCallId, TPEHangUpOptions aAutoResumeOption );

        /**
        * Determines if there is a call in given state.
        * @since Series60_4.0
        * @param aState Call state search key.
        * @return TBool, ETrue is there is a call; otherwise EFalse.
        */
        IMPORT_C TBool IsCallInState( TPEState aState ) const;
        
        /**
        * Determines if there is a call in given state.
        * @since Series60_4.0
        * @param aState Call state search key.
        * @return callid is there is a call; otherwise KPECallIdNotUsed( -1 ).
        */
        IMPORT_C TInt GetCallIdByState( TPEState aState ) const;

        /**
        * Makes reject request to the Multimode ETel 
        * @return Return possible error code
        */
        IMPORT_C TInt RejectCall( );

        /**
        * Makes HangUp requests for all call to the Multimode ETel. 
        * @return Error (KErrNotFound if there is not a call and KErrNone if there one call at least).
        */
        IMPORT_C TInt ReleaseAll();

        /**
        * Set Dynamic Hscsd parameters.
        * @param const TInt aRxSlots, Hscsd data call received timeslots amount
                 const TInt aCallId, data call id.  
        * @return KErrNone or KErrNotFound.
        */
        IMPORT_C TInt SetDynamicHscsdParams( TInt aRxSlots, TInt aCallId );

        /**
        * Terminate all connection request. 
        */
        IMPORT_C TInt TerminateAllConnections();
        
        /**
        * Asks phone identity parameters from the mmetel.
        * @param aMessage Reply message to the phone application.
        * @return Error (KErrNone or KErrNotFound).
        */
        IMPORT_C TInt UpdatePhoneIdentity( 
            MEngineMonitor::TPEMessagesFromPhoneEngine aMessage );

        /**
        * Sets active line
        */
        IMPORT_C void SetActiveLine();

        /**
        * Makes transfer request to the Multimode ETel 
        * @param None.
        * @return Return possible error code
        */
        IMPORT_C TInt BuildConference();
        
        /**
        * Swaps connected and held calls
        * @since Series60_4.0
        * @param  None.
        * @return KErrNone or KErrNotFound.
        */
        IMPORT_C TInt SwapCalls();
        
        /**
        * Add conference member.
        * @return possible error code from the CallHandling subsystem.
        */
        IMPORT_C TInt AddConferenceMember();

        /**
        * Drops one member from the conference call
        * @since Series60_4.0
        * @param aCallid It is the Call Id of the call to be dropped
        * @return Return possible error code
        */
        IMPORT_C TInt DropMember( TInt aCallId );

        /**
        * Splits one member from the conference call. 
        * @since Series60_4.0
        * @param aCallid It is the index number of the call to be splited. 
        * @return Return possible error code
        */
        IMPORT_C TInt GoOneToOne( TInt aCallId );

        /**
        * Makes hold request for the connected call
        * @return KErrNone if request was sent successfully
        *         KErrGsmNotAllowed if no connected call was found
        */
        IMPORT_C TInt HoldCall();

        /**
        * Makes resume request for the held call
        * @return KErrNone if request was sent successfully
        *         KErrGsmNotAllowed if no held call was found
        */
        IMPORT_C TInt ResumeCall();

        /**
        * Makes transfer request to the Multimode ETel 
        * @since Series60_4.0
        * @param None. 
        * @return KErrNone or KErrNotFound.
        */
        IMPORT_C TInt TransferCalls();

        /**
        * Creates emergency call request to the Multimode ETel 
        * @since Series60_4.0
        * @param None. 
        * @return None.
        */
        IMPORT_C void DialEmergencyCall( const TPEPhoneNumber& aEmergencyNumber );

        /**
        * Returns call terminated diagnostics of a call
        * Info is valid only for Idle call
        * @since Series60_4.0
        * @param aCallName, TName information of a call
        * @return Return diagnostics info
        */
        IMPORT_C TInt GetCallTerminatedDiagnostics( 
            TName& aCallName ) const;

        /**
        * Returns call terminated error
        * @since Series60_4.0
        * @return Return errorCode
        */        
        IMPORT_C TInt CallTerminatedError( const TInt aCallId );
        
        /**
        * This method gets the lifetime of the MS. The lifetime information 
        * includes the manufacturing date of the MS and the total amount of airtime use.
        * @param aLifeTimeInfo Life time information
        * @return Get succeeded or not.
        */
        IMPORT_C TBool GetLifeTime( TDes8& aLifeTimeInfo );
        
        /**
        * Replace active call with waiting call. 
        * @since Series60_5.0
        * @return Error (KErrNone is success).
        */
        IMPORT_C TInt ReplaceActive();
        
        /**
        * This method gets the reference to MPECallOwner object.
        * @since Series60_4.0
        * @param  None.
        * @return None.
        */
        IMPORT_C MPECallOwner& CallOwner() const;

        /**
         * Accepts unattended transfer request. 
         * @since    Series 60 v5.1
         * @return   System wide error code.
         */
        IMPORT_C TInt AcceptUnattendedTransfer();
        
        /**
         * Rejects unattended transfer request. 
         * @since    Series 60 v5.1
         * @return   System wide error code.
         */
        IMPORT_C TInt RejectUnattendedTransfer();

        /**
        * Does unattended transfer to the connected VoIP call 
        * @since Series60_5.1
        * @param aTransferTarget Address of the transfer target
        * @return Error (KErrNone is success).
        */
        IMPORT_C TInt DoUnattendedTransfer( const TDesC& aTransferTarget );

        /**
        * Starts call forwarding. 
        * @since Series60_5.1
        * @param aIndex A array index for a selected address.
        * @return Error (KErrNone is success).
        */
        IMPORT_C TInt ForwardCallToAddress( TInt aIndex );
        
        /**
        * Makes HangUp requests for conference call. 
        * @return Error (ECCPErrorNotFound if there is not a conference call 
        * 
        */
        IMPORT_C TInt ReleaseConference();

    public: // From MPECallHandling - DTMF related
        /**
        * Cancels Dtmf string sending.
        */
        IMPORT_C void CancelDtmfPlay();        

        /**
        * Allows a client to continue dtmf string sending when 
        * it was stopped by use of 'w' char in the string.
        */
        IMPORT_C void ContinueDtmfSending();

        /**
        * Sends dtmf string.
        * @param aDtmfString String to be sent.
        * @return Symbian OS error code
        */
        IMPORT_C TInt SendDtmf( const TPEDtmfString& aDtmfString );

        /**
        * Sends dtmf tone
        * @param aTone Tone to be sent.
        * @return Error (KErrNone or KErrNotFound).
        */
        IMPORT_C TInt StartDtmfTone( const TChar& aTone );

        /**
        * Allows a client to cancel the sending of a dtmf string when 
        * it was stopped by use of 'w' char in the string.
        */
        IMPORT_C void StopDtmfSending();

        /**
        * Stops sending dtmf tone.
        * @return Error (KErrNone or KErrNotFound).
        */
        IMPORT_C TInt StopDtmfTone();

    public: // From base class MPECallInitialiser

        /**
        * @see MPECallInitialiser::InitVoiceCall
        */
        void InitVoiceCall( MCCECall& aNewCall );
        
        /**
        * @see MPECallInitialiser::InitVideoCall
        */
        void InitVideoCall( MCCECall& aNewCall );

        /**
        * @see MPECallInitialiser::InitConferenceCall
        */
        void InitConferenceCall( MCCEConferenceCall& aConference );

    public:
        /**
        * Tells if there is any connected calls.
        * @return Indication of connected call(s) (EFalse is no calls, ETrue is connected call(s)).
        */
        TBool ConnectedCalls();

        /**
        * Returns voice call object by state.
        * @param aState Call state search key.
        * @param aIndex Index of the found call object (-1 is not found).
        * @param aGetCommandObject (if ETrue then find by command object state).
        * @return Call object (NULL is not found).
        */
        CPESingleCall* VoiceCallDataByState( 
            TPEState aState, 
            TInt& aIndex ) const;
        
        /**
        * SetCallParams.
        * @param None.
        * @return None.
        */
        void SetCallParams( TInt aCallId );

        /**
        * Creates CPECallData objects
        * @since Series60_4.0
        * @param None. 
        * @return None. 
        */
        void CreateCallDataArraysL();

        /**
        * Create conference call
        */
        void CreateConferenceCallL( CPESingleCall& aCall1, CPESingleCall& aCall2 );
        
        /**
        * Returns number of conference members
        * @since Series60_4.0
        * @param aCount It is variable, where number of participants is returned
        * @return Return possible error code
        */
        TInt GetNumberOfParticipants( TInt& aCount );

        /**
        * Returns added or removed members TName information and CallId
        * @since Series60_4.0
        * @param aCallId, Conference calls CallId
        * @param aCallName, TName information of dropped or added call
        * @param aMemberCallId, CallId of the added or dropped call
        * @return Return errorCode
        */
        TInt GetConferenceMemberNameAndId( TName& aCallName, TInt& aMemberCallId );

        /**
        * Get call control caps
        * @since Series60_4.0
        * @param aCallControlCaps, the call control caps.
        * @return KErrNone or KErrNotFound.
        */        
        TInt GetCallControlCaps( TPECallControlCaps& aCallControlCaps, TInt aCallId );
     
        /**
        * Returns Conference capabilities
        * @since Series60_4.0
        * @param aCallId, call identification number
        * @param aCaps, capabilities are returned in this variable
        * @return Return errorCode
        */
        TInt GetConferenceCallCaps( TUint32& aCaps );
        
        /**
        * Create new CPESingleCall object to CPECallArrayOwner and open new MCCECall ojcte to CCE.
        * @param None.
        * @return returns pointer to CPESingleCall objecte.
        */
        CPESingleCall* OpenNewCallL( const TPEPhoneNumber& aNumber );

        /**
        * Adds one member to the conference call ( TRAPPED METHOD )
        * @since Series60_4.0
        * @param aCallid It is the index number of the call to be added
        * @return Return possible error code
        */
        TInt AddMember( TInt aCallId );
    
        /**
        * Adds one member to the conference call
        * @since Series60_4.0
        * @param aCallid It is the index number of the call to be added
        */
        void AddMemberL( TInt aCallId );
        
        /**
        * Get call's secure status.
        * @param aCallid.
        * @return TBool ETrue if security is enabled, else EFalse.
        */
        TBool IsSecureCall( const TInt aCallId ) const;
        
        /** 
        * Update System Agent setting for call forward.
        * @since Series60_4.0
        */
        void UpdateSaSetting();
        
        /** 
        * Defines basic service code for divert notification.
        * @since Series60_4.0
        * @param aLineType used line type
        * @param call reference to call object
        * @return Returns the basuc service code. 
        */ 
        TInt DefineDivertBsc( CCCECallParameters::TCCELineType aLineType, 
                              CPESingleCall* call );

        /**
        * Check if dial allowed   
        * @param aMultimediaDial. Is new dial multimedia
        * @return ETrue if dial allowed
        */
        TBool IsDialAllowed( TBool aMultimediaDial );

        /**
        * Get call's secure specified status.
        * @param aCallid.
        * @return TBool ETrue if security is specified, else EFalse.
        */
        TBool SecureSpecified( const TInt aCallId ) const; 
        
        /**
        * Initialise conference call info.
        * @param call reference to call object
        * @param call reference to call object
        * @return None.
        */
        void InitialiseConferenceCallInfo( 
            MCCECall& aCall1, 
            MCCECall& aCall2 );
        
        /**
        * Handle auto resume.
        */
        void HandleAutoResume();
        
    private:
        
        /**
        * Delete's call object and reset's datastore.
        * @param aCallid.
        */
        TInt ReleaseCallObject( const TInt aCallId  ); 
        
        /**
         * Set call origin to datastore.
         * @param aCallid.
         * @param aCall reference to call object
         */
        void SetCallOrigin( const TInt aCallId, const MCCECall& aCall ) const;
        
        /**
         * Set COLP number to datastore if remote party number is 
         * different from dialled number.
         * @param aCallid.
         * @param aCall reference to call object
         * @return Updating Colp number was necessary.
         */
        TBool UpdateColpNumber( TInt aCallId, const MCCECall& aCall ) const;

    protected:
        // Phone model instance which owns this object.
        MPEPhoneModelInternal& iModel;
        // Handle to converged call engine (CCE) interface
        CCCE& iConvergedCallEngine;
        // Video call handling object handles video call operations.
        CPEVideoCallHandling* iVideoCallHandling;
        // CPEDtmfHandling object handles dtmf commands
        CPEDtmfHandling* iDtmfHandling;   
        // Member variable for CallHandling Errorcode
        TInt iErrorCode;
        // Call parameters for dialing
        CCCECallParameters* iCallOpenParams;
        
        
        //Create conference call CPEConferenceCall object
        CPEConferenceCall* iConferenceCall;
        // Supplementary Service Monitor
        CPESupplementaryServicesMonitor* iSupplementaryServicesMonitor;
        // Call array owner
        CPECallArrayOwner* iCallArrayOwner;
        // CCE dtmf interface
        MCCEDtmfInterface& iDtmfInterface;
        // Active line
        CCCECallParameters::TCCELineType iActiveLine;
        // Owned system agent observer. 
        CPsetSAObserver* iPsetSAObserver;
        // Emergency number
        TPEPhoneNumber iEmergencyNumber;
        // ReplaceActive       
        TBool iReplaceActive;
        // Status of dial, before dialing state
        TBool iDialRequest;

        /**
         * CCE observer.
         */
        CPECCEObserver* iCCEObserver;
        // System Call State
        CPESystemCallState* iSystemCallState;
        
        CRepository* iRepository;
    };

#endif    // CPECALLHANDLING_H
            
// End of File
