/*
* Copyright (c) 2005-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:   Provide interface for the client requestin availability class.
*
*/



#include "musavanetworkavailability.h"
#include "musavaavailabilityobserver.h"
#include "musavasettingsimp.h"
#include "musavanetworkavailability.h"
#include "mussesseioninformationapi.h"
#include "musavaobserver.h"
#include "musavasharedobject.h"
#include "muslogger.h"
#include "musavacalleventmonitor.h"

#include <e32base.h>


CMusAvaNetworkAvailability* CMusAvaNetworkAvailability::NewL(
    MMusAvaAvailabilityObserver& aObserver,
    CMusAvaSettingsImp& aSettings )
    {
    CMusAvaNetworkAvailability* self =
        CMusAvaNetworkAvailability::NewLC(
            aObserver,
            aSettings );

    CleanupStack::Pop( self );
    return self;
    }


CMusAvaNetworkAvailability* CMusAvaNetworkAvailability::NewLC(
    MMusAvaAvailabilityObserver& aObserver,
    CMusAvaSettingsImp& aSettings )
    {
    CMusAvaNetworkAvailability* self =
        new( ELeave ) CMusAvaNetworkAvailability(
            aObserver,
            aSettings );

    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }


CMusAvaNetworkAvailability::~CMusAvaNetworkAvailability()
    {
    if ( iPhoneStatus )
        {
        iPhoneStatus->Cancel();
        }
    delete iPhoneStatus;
    iPhoneStatus = NULL;
    }


CMusAvaNetworkAvailability::CMusAvaNetworkAvailability(
    MMusAvaAvailabilityObserver& aObserver,
    CMusAvaSettingsImp& aSettings )
    :CMusAvaAvailability( aObserver ),
    iSettings( aSettings ),
    iConfcall( EFalse )
    {
    }


void CMusAvaNetworkAvailability::ConstructL()
    {
    iPhoneStatus = CMusAvaCallEventMonitor::NewL( *this );
    }


// -------------------------------------------------------------------------
//  Starts the loopy execution.
// -------------------------------------------------------------------------
//
void CMusAvaNetworkAvailability::DoExecuteL()
    {
     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaNetworkAvailability::\
     Execute()" )

    // read the current value and subscribe for changes
    // that's done in RunL    
    switch (iPhoneStatus->CallStatusL())
        {
            case NMusSessionInformationApi::ECallConnected:                 
                {
                 TBuf<CMusAvaCallEventMonitor::KMusTelNumberMaxLength> telNumber;
                 iPhoneStatus->GetTelNumberL( telNumber );
                 iSettings.SetTelNumberL( telNumber );
                 iSettings.SetCallDirection( iPhoneStatus->CallDirectionL() );
                 iSettings.SetCallPrivacy( iPhoneStatus->CallPrivacyL() );
        
                 SetState( MMusAvaObserver::EMusAvaStatusAvailable );
                 break;
                }      
            case NMusSessionInformationApi::ECallHold:  
                 SetState( MMusAvaObserver::EMusAvaStatusCallOnHold );
                 break;
            case NMusSessionInformationApi::EConferenceCall:
                 SetState( MMusAvaObserver::EMusAvaStatusConferenceCall );
                 break;
            case NMusSessionInformationApi::ENoCall:
                 SetState( MMusAvaObserver::EMusAvaStatusNoCall );
                 break;
            default:
                 SetState( MMusAvaObserver::EMusAvaStatusNoCall );
                 break;
        }

    // subscribe for the future changes.
    iPhoneStatus->StartMonitoringL();

    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaNetworkAvailability::\
                ExecutePatternL()" )
    }


void CMusAvaNetworkAvailability::Stop()
    {
    iPhoneStatus->Cancel();
    SetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
    }


MMusAvaObserver::TAvailabilityName CMusAvaNetworkAvailability::Name()
    {
    return MMusAvaObserver::EMusAvaNameNetworkStatus;
    }

// -------------------------------------------------------------------------
//  This function is called when a cs call is connected.
// -------------------------------------------------------------------------
//
void CMusAvaNetworkAvailability::CallConnectedL( const TDesC& aTelNumber )
    {
    MUS_LOG( "mus: [MUSAVA]  \
                -> CMusAvaNetworkAvailability::CallConnectedL()" )
                
// try to resolve to contact information of the remote host	
	iSettings.SetTelNumberL( aTelNumber );
	iSettings.SetCallDirection( iPhoneStatus->CallDirectionL() );
	iSettings.SetCallPrivacy( iPhoneStatus->CallPrivacyL() );
   
	//isn't the phone sent option successfully
    if ( ( aTelNumber != iSettings.OptionSentTelNumber()  
    	   || iSettings.OptionSentTelNumber() == KNullDesC() )
    	   && iConfcall )
   	    {
        MUS_LOG("CMusAvaNetworkAvailability::CallConnectedL EMusAvaStatusInProgress");
        iSettings.ReleaseOptionSentNumber();
        SetState( MMusAvaObserver::EMusAvaStatusInProgress );         
   	    }
    else
    	{
	    SetState( MMusAvaObserver::EMusAvaStatusAvailable );
	    MUS_LOG("CMusAvaNetworkAvailability::CallConnectedL EMusAvaStatusAvailable");
			
    	  }

    MUS_LOG( "mus: [MUSAVA]  \
                <- CMusAvaNetworkAvailability::CallConnectedL()" )
    }


// -------------------------------------------------------------------------
//  This function is called when a cs call goes into a state
//  that is not connected.
// -------------------------------------------------------------------------
//
void CMusAvaNetworkAvailability::ConferenceCallL()
    {
    MUS_LOG( "mus: [MUSAVA]  \
            -> CMusAvaNetworkAvailability::ConferenceCallL()" )
    //Report line status
    iConfcall = ETrue;
    SetState( MMusAvaObserver::EMusAvaStatusConferenceCall );
    MUS_LOG( "mus: [MUSAVA]  \
                <- CMusAvaNetworkAvailability::ConferenceCallL()" )
    }


// -------------------------------------------------------------------------
//  This function is called when a cs call goes hold
// -------------------------------------------------------------------------
//
void CMusAvaNetworkAvailability::CallHoldL( const TDesC& aTelNumber )
    {
    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaNetworkAvailability::CallHoldL()" )
    //Report line status
    iSettings.SetTelNumberL( aTelNumber );
    iSettings.SetCallDirection( iPhoneStatus->CallDirectionL() );
    iSettings.SetCallPrivacy( iPhoneStatus->CallPrivacyL() );
    SetState( MMusAvaObserver::EMusAvaStatusCallOnHold );
    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaNetworkAvailability::CallHoldL()" )
    }


// -------------------------------------------------------------------------
//  This function is called when a cs call goes into a state
//  that is not connected.
// -------------------------------------------------------------------------
//
void CMusAvaNetworkAvailability::NoActiveCallL()
    {
    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaNetworkAvailability::NoActiveCallL()" )

    iSettings.SetTelNumberL( KNullDesC() );

    //Report line status
    //Availability status
    SetState( MMusAvaObserver::EMusAvaStatusNoCall );

    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaNetworkAvailability::NoActiveCallL()" )
    }

// -------------------------------------------------------------------------
//This function is called when conference call terminted
//
// -------------------------------------------------------------------------
//
void CMusAvaNetworkAvailability::ConferenceCallLTerminated()
	{
    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaNetworkAvailability::ConferenceCallLTerminated()" )
    if ( iConfcall )
    	{
        iConfcall = EFalse;
    	}
    AvailabilitiesAbleToShowIndicator();

    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaNetworkAvailability::ConferenceCallLTerminated()" )
	}
