phoneclientserver/callui/src/cauiengine/cauienginestub.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 16:24:46 +0300
changeset 19 e44a8c097b15
permissions -rw-r--r--
Revision: 201017 Kit: 201019

/*
* Copyright (c) 2004-2005 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:  Implementation of CallUIEngine, stub version.
*
*/



// INCLUDE FILES
#include    "cauiengine.h" 
#include    "cauidialogs.h" 

#include    <callui.rsg> // resources. 
#include    <cphcltdialer.h> // cphcltdialer. 
#include    <cphonecntfactory.h> 
#include    <aiwinternaldialdata.h> 
#include    <aiwservicehandler.h> 
#include    <cphcltextphonedialdata.h> // cphcltextphonedialdata 

#include    "callui.loc" // localized strings. 

#include    <stringloader.h> // string loader. 
#include    <featmgr.h> // featuremanager. 

#include    <phcltutils.h> // character removal. 
#include    <aiwcommon.h> // aiw dialdata. 

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CCaUiEngine::CCaUiEngine
// 
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CCaUiEngine::CCaUiEngine()
:   iResourceLoader( *CCoeEnv::Static() )
#ifndef RD_PHONE_NG
    ,iResourceLoaderPhoneApE( *CCoeEnv::Static() )
#endif    
    {
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::ConstructL
// 
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CCaUiEngine::ConstructL()
    {
    // Sets up TLS, must be done before FeatureManager is used.
    FeatureManager::InitializeLibL();

    if( CCoeEnv::Static() )
        {
        // Open CallUI resource file.
        TFileName* name = new ( ELeave ) TFileName( KCallUIResFile );
        CleanupStack::PushL( name );
        User::LeaveIfError( iResourceLoader.Open( *name ) );
        CleanupStack::PopAndDestroy( name );
        }
    }

// -----------------------------------------------------------------------------
// CCaUiEngine::NewL
// 
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CCaUiEngine* CCaUiEngine::NewL()
    {
    CCaUiEngine* self = new( ELeave ) CCaUiEngine;
    
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();

    return self;
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::~CCaUEngine
// 
// Destructor.
// -----------------------------------------------------------------------------
//
CCaUiEngine::~CCaUiEngine()
    {
    delete iContactSelector;
    delete iFactory;

    // Clear dial components.
    ClearDialContents();

    if( CCoeEnv::Static() )
        {
        // Close resource loader.
        iResourceLoader.Close();
        
#ifndef RD_PHONE_NG
        // Release PhoneAppEngine resources.
        iResourceLoaderPhoneApE.Close();
#endif
        }
    
    // Delete the menubuffer.
    delete iBuf;
    iBuf = NULL;

    // Frees the TLS! Must be done after FeatureManager is used.
    FeatureManager::UnInitializeLib();
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::GetResources
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::GetResources(
    const TCaUiEngResource aResource,
    TFileName& aResFile,
    TInt& aResId )
    {
    aResFile = KCallUIResFile;
    if ( aResource == ECaUiResOnlyInternet )
        {
        aResId = 0;
        }
    else
        {
        // Return pure voice menu item.
        aResId = R_CALLUI_CALL_MENU;
        }
    }

// -----------------------------------------------------------------------------
// CCaUiEngine::DialL
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::DialL(
    MCaUiDialResultObserver& aObserver,
    const TDesC8& aDialData,
    const TCaUiCallType aCallType )
    {
    TInt length = aDialData.Length();
   
    // If iPhCltDialer and iDialDataContainer exist, 
    // destroy them and create new ones. This clears the dial data.
    ClearDialContents();
    iPhCltDialer = CPhCltExtPhoneBase::NewL( this );
    iObserver = &aObserver;
    
    iDialData = CPhCltExtPhoneDialData::NewL();
    CAiwInternalDialData* aiwDialData = CAiwInternalDialData::NewLC( aDialData );

    // Convert AIW dial data to PhoneClient format.
   
    ConvertDialDataL( *aiwDialData );

    iDialData->SetCallType( EPhCltVoice );
    
    //a call type is still unknown if the dialing is made via phonebook
    //send key (doesn't use HandleMenuCmdL, check the call type in 
    //aiwDialData to make sure if unknown is really unknown
    //only do if call type unknown
    TCaUiCallType callType = aCallType;
    if ( callType == ECaUiCallTypeUnknown )
        {
        CAiwDialData::TCallType aiwCalltype = aiwDialData->CallType();
        
        switch ( aiwCalltype )
           {
           case CAiwDialData::EAIWVoice:
                callType = ECaUiCallTypeVoice;
                break;
            case CAiwDialData::EAIWVideo:
            case CAiwDialData::EAIWForcedVideo:
                callType = ECaUiCallTypeVideo;
                break;
            case CAiwDialData::EAIWVoiP:
                callType = ECaUiCallTypeInternet;
                break;
            default:
                //already unknown
                break;
            }
        }
        
    //aiwDialData not needed anymore, remove from stack
    CleanupStack::PopAndDestroy( aiwDialData );

    // If Contact link is provided fetch field link from Phone Book.
    if ( iDialData->ContactLink() != KNullDesC8() )
        {
        // Launch address select.
        // aCallType describes which selector is used. ( VoIP/PhoneNumber )
        LaunchAddressSelectL( 
                        iDialData->ContactLink(), 
                        callType );
        }
    

    else 
        {
        iPhCltDialer->DialL( *iDialData );
        }
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::LaunchNoNetSupNoteL
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::LaunchNoNetSupNoteL()
    {
    User::Leave( KErrNotSupported );
    }



// -----------------------------------------------------------------------------
// CCaUiEngine::LaunchReconConfQueryL
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::LaunchReconConfQueryL( 
    MCaUiReconnectQueryObserver& /*aObserver*/,
    CPhCntMatcher* /*aPhCntMatcher*/,
    const TPtrC /*aPhoneNumber*/,
    const TBool /*aIncludeVideoCallOption*/ )
    {
    User::Leave( KErrNotSupported );
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::CancelReconConfQuery
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::CancelReconConfQuery()
    {
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::LaunchNoteAndReconConfQueryL
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::LaunchNoteAndReconConfQueryL( 
    MCaUiReconnectQueryObserver& /*aObserver*/,
    CPhCntMatcher* /*aPhCntMatcher*/,
    const TPtrC /*aPhoneNumber*/,
    const TBool /*aIncludeVideoCallOption*/,
    const TPtrC /*aNoteText*/ )
    {
    User::Leave( KErrNotSupported );
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::CancelNoteAndReconConfQuery
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::CancelNoteAndReconConfQuery()
    {
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::LaunchAddressSelectL
// 
// 
// -----------------------------------------------------------------------------
//
TBool CCaUiEngine::LaunchAddressSelectL( 
    TDes& aTelNum, 
    const TInt aContactId,
    const TBool aVoIPAddressSelect )
    {
    if ( aVoIPAddressSelect )
        {
        User::Leave( KErrNotSupported );
        }

    TBool addressSelected( EFalse );
    TCaUiCallType callType( ECaUiCallTypeVoice );
    
    addressSelected = LaunchAddressSelectL( aTelNum, aContactId, callType );

    return addressSelected;
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::CancelAddressSelect
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::CancelAddressSelect()
    {
    }

// -----------------------------------------------------------------------------
// From MPhCntStoreLoaderObserver.
// CCaUiEngine::ContactStoreLoadingCompleted
// -----------------------------------------------------------------------------
//
void CCaUiEngine::ContactStoreLoadingCompleted( 
        MVPbkContactStore* /*aStore*/, TInt /*aErrorCode*/ )
    {
    }


// -----------------------------------------------------------------------------
// CCaUiEngine::HandleDialL
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::HandleDialL( const TInt aStatus )
    {
    if ( iObserver )
        {
        iObserver->HandleDialResultL( aStatus );
        }
    
    ClearDialContents();
    }
    
// -----------------------------------------------------------------------------
// From base class MCaUiReconnectQueryObserver
// -----------------------------------------------------------------------------
//   
void CCaUiEngine::OptionSelected( 
    MCaUiReconnectQueryObserver::TCaUiReconType /*aReconType*/ )
    {
    }

// -----------------------------------------------------------------------------
// CCaUiEngine::ConvertDialData
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::ConvertDialDataL(
    const CAiwInternalDialData& aAiwDialData )
    {
    // Telephony number.
    iDialData->SetTelephoneNumber( aAiwDialData.PhoneNumber().Left( 
        iDialData->TelephoneNumber().MaxLength() ) );

    // Call type.
    CAiwDialData::TCallType aiwCallType = aAiwDialData.CallType();
    TPhCltCallType phCltCallType = EPhCltVoice;

    // After this the call type should be correct one.
    if ( aiwCallType == CAiwDialData::EAIWVideo )
        {
        phCltCallType = EPhCltVideo;
        iDialData->SetCallType( phCltCallType );
        }
    else if ( aiwCallType == CAiwDialData::EAIWForcedVideo )
        {
        phCltCallType = EPhCltForcedVideo;
        iDialData->SetCallType( phCltCallType );
        }
    else if ( aiwCallType == CAiwDialData::EAIWVoiP )
        {
        phCltCallType = EPhCltCallVoIP;
        iDialData->SetCallType( phCltCallType );
        }

     // Name.
    iDialData->SetNameL( aAiwDialData.Name().Left( 
        iDialData->Name().MaxLength() ) );

    // Contact link.
    iDialData->SetContactLinkL( aAiwDialData.ContactLink() );

    // Window group.
    iDialData->SetWindowGroup( aAiwDialData.WindowGroup() );

    // Redial.
    iDialData->SetRedial( aAiwDialData.Redial() );
    
    // Redial maximum duration.
    iDialData->SetRedialMaximumDuration( aAiwDialData.RedialMaximumDuration() );

    // Show number.
    iDialData->SetShowNumber( aAiwDialData.ShowNumber() );

    // Match.
    iDialData->SetAllowMatch( aAiwDialData.AllowMatch() );

    // End other calls.
    iDialData->SetEndOtherCalls( aAiwDialData.EndOtherCalls() );

    // Subaddress.
    iDialData->SetSubAddressL( aAiwDialData.SubAddress().Left( 
        iDialData->SubAddress().MaxLength() ) );

    // SAT call.
    iDialData->SetSATCall( aAiwDialData.SATCall() );

    // Bearer.
    iDialData->SetBearerL( aAiwDialData.Bearer().Left( 
        iDialData->Bearer().MaxLength() ) );

    TPhCltTelephoneNumber telnum;
    telnum.Zero();
    telnum = iDialData->TelephoneNumber();
    PhCltUtils::RemoveInvalidChars( telnum );
    iDialData->SetTelephoneNumber( telnum );

    }

// -----------------------------------------------------------------------------
// CCaUiEngine::ClearDialContents
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::ClearDialContents()
    {
    if ( iPhCltDialer )
        {
        delete iPhCltDialer;
        iPhCltDialer = NULL;
        }

    if ( iDialData )
        {
        delete iDialData;
        iDialData = NULL;
        }

    // Not owned, so just set to NULL.
    iObserver = NULL;
    }

// -----------------------------------------------------------------------------
// CCaUiEngine::LaunchAddressSelectL
// 
// 
// -----------------------------------------------------------------------------
//
void CCaUiEngine::LaunchAddressSelectL( 
    const TDesC8& aContactLink,
    const TCaUiCallType aCallType )
    {
    if ( aCallType != ECaUiCallTypeVoice )
        {
        HandleDialL( KErrNotSupported );
        }
    
    else
        {
        if ( !iFactory )
            {
            iFactory = CreateCntFactoryL();
            }
        if ( !iContactSelector ) 
            {
            iContactSelector = iFactory->CreateContactDataSelectionL();
            }
            
        CPhCntContactDataSelection::TCallType callType;
        
        if ( aCallType == ECaUiCallTypeVoice )
            {
            callType = CPhCntContactDataSelection::ECallPhoneNumber;
            }
        else if ( aCallType == ECaUiCallTypeVideo )
            {
            callType = CPhCntContactDataSelection::ECallVideoNumber;
            }
        else if ( aCallType == ECaUiCallTypeInternet )
            {
            callType = CPhCntContactDataSelection::ECallVoip;
            }
        else
            {
            callType = CPhCntContactDataSelection::ECallPhoneNumber;
            }
            
        iContactSelector->Cancel();
        iContactSelector->SelectPhoneNumberForCallL( aContactLink, callType, *this );
 
        }
     
    }

// ---------------------------------------------------------
//  CCaUiEngine::HandleEmergencyDialL()
// ---------------------------------------------------------
//    
void CCaUiEngine::HandleEmergencyDialL( const TInt /*aStatus*/ )
    {
    // Do nothing
    }

// ---------------------------------------------------------
//  CCaUiEngine::SelectionDone()
// ---------------------------------------------------------
//     
void CCaUiEngine::SelectionDone( CPhCntSelectedData* aContactData, 
                                  TInt aErrorCode )
    {
    if ( aErrorCode == KErrNone )
        {
        TPhCltTelephoneNumber phoneNumber;
        HBufC8* fieldLink = NULL;
        
        if ( iDialData->TelephoneNumber() == KNullDesC )
            {
            phoneNumber = aContactData->Data();
            PhCltUtils::RemoveInvalidChars( phoneNumber );
            iDialData->SetTelephoneNumber( phoneNumber );
            }
        if ( aContactData->FieldLink().Length() > 0 )
            {
            fieldLink = aContactData->FieldLink().Alloc();
            }
        
        TRAP( aErrorCode, PhoneClientDialL( fieldLink ) );
      
        delete fieldLink;
        fieldLink = NULL;
        }
        
    if ( aErrorCode != KErrNone )
        {
        TRAP_IGNORE( HandleDialL( aErrorCode ) );
        }            
    }
    
// ---------------------------------------------------------
//  CCaUiEngine::PhoneClientDialL()
// ---------------------------------------------------------
// 
void CCaUiEngine::PhoneClientDialL( const TDesC8* aFieldLink )
    {
    
    TBool createCall( ETrue );
    TInt error( KErrNone );
    
    if ( aFieldLink )
        {
        iDialData->SetContactLinkL( *aFieldLink );
        }
    
    // Check if number is emergency number and if it is 
    // then call emeregency call
    if ( !iEmergencyCall )
        {
        iEmergencyCall = CPhCltEmergencyCall::NewL( this );
        }
    if ( IsEmergencyNumber() )
        {
        createCall = EFalse;
        if ( aFieldLink )
            {
            error = KErrNone;
            iEmergencyCall->DialEmergencyCallL( iDialData->TelephoneNumber() );
            }
        else
            {
            error = KErrNotSupported;
            }
        }
    
    // Here note launch + query if this is video call and we
    // are not in 3G network.
   
    if ( createCall )
        {
        if ( ( iDialData->CallType() == EPhCltVideo ) ||
             ( iDialData->CallType() == EPhCltForcedVideo ) ||
             ( iDialData->CallType() == EPhCltCallVoIP ) )
            {
                createCall = EFalse;
                error = KErrNotSupported;
            }
            
        }
    if ( createCall )
        {
        iPhCltDialer->DialL( *iDialData );
        }
    else 
        {        
        //User cancelled. Need to inform client.
        if ( error != KErrNone ) // Emergency call does not need to inform client. 
            {
            HandleDialL( error );
            }
         }
    }

// ---------------------------------------------------------
//  CCaUiEngine::IsEmergencyNumber()
// ---------------------------------------------------------
//
TBool CCaUiEngine::IsEmergencyNumber()
    {
    TBool isEmergencyNumber( EFalse );
    
    // get phonenumber from iDialData and heck number using phoneclient
    // emergencycall api
    TInt result = iEmergencyCall->IsEmergencyPhoneNumber(
        iDialData->TelephoneNumber(), 
        isEmergencyNumber );
   
    return isEmergencyNumber;
    }

// -----------------------------------------------------------------------------
// CCaUiEngine::IsVoIPProfiles()
// 
// 
// -----------------------------------------------------------------------------
//
TBool CCaUiEngine::IsVoIPProfiles()
    {  
    return EFalse; 
    }

// End of file