gssettingsuis/Gs/GSCallPlugin/src/GSCallPluginModel.cpp
author hgs
Thu, 04 Nov 2010 13:38:47 +0800
changeset 68 13e71d907dc3
parent 0 8c5d936e5675
permissions -rw-r--r--
201044

/*
* Copyright (c) 2002-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: 
*        Model/Engine for Call Settings Plugin
*
*/


// INCLUDE FILES
#include "GSCallPluginModel.h"
#include "GsLogger.h"      //for logging traces
#include "SettingsPrivateCRKeys.h"

#include <barsc.h>
#include <barsread.h>
#include <coecntrl.h>
#include <f32file.h>
#include <AknQueryDialog.h>
#include <s32file.h>
#include <featmgr.h>
#include <PsetCSP.h>
#include <generalsettingsvariant.hrh>
#include <PSVariables.h>  //PubSub 
#include <settingsinternalcrkeys.h>
#include <LogsDomainCRKeys.h>

#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)
#include <spsettings.h>
#endif // __VOIP && RD_VOIP_REL_2_2
//CONSTANTS
// default value for autolock period
// default value for Sat operations

_LIT( KGSNameOfClass, "CGSCallPluginModel" );

// Max int size

//for switching values in SwitchValue()
const TInt KGSSettingOff = 0;
const TInt KGSSettingOn = 1;
const TInt KGSIndexOff = 1;
const TInt KGSIndexOn = 0;

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

// ----------------------------------------------------------------------------
// CGSCallPluginModel::NewL
// 
// Symbian OS two-phased constructor
// ----------------------------------------------------------------------------
//
CGSCallPluginModel* CGSCallPluginModel::NewL()
    {
    CGSCallPluginModel* self = new( ELeave ) CGSCallPluginModel;
    CleanupStack::PushL( self );
    self->ConstructL();

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


// ----------------------------------------------------------------------------
// CGSCallPluginModel::CGSCallPluginModel
// 
// C++ default constructor can NOT contain any code, that
// might leave.
// ----------------------------------------------------------------------------
//
CGSCallPluginModel::CGSCallPluginModel()
    {
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::ConstructL
// 
// EPOC default constructor can leave.
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::ConstructL()
    {
    FeatureManager::InitializeLibL();

    InitializeCentralRepositoryL();

    iBackgroundApi = CGSBackgroundImage::NewL();

    SetCSPActiveL( ETrue );

    User::LeaveIfError( iGSVariationRepository->Get( 
                        KSettingsVariationFlags, iLocalVariationValues ) );
#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)
	iSpSettings = CSPSettings::NewL();  
#endif // __VOIP && RD_VOIP_REL_2_2
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::~CGSCallPluginModel
// 
// Destructor
// ----------------------------------------------------------------------------
//
CGSCallPluginModel::~CGSCallPluginModel()
    {
    FeatureManager::UnInitializeLib();
	UninitializeCentralRepository();
    
    if ( GetCSPStatus() )
        {
        TRAP_IGNORE( SetCSPActiveL( EFalse ) );
        }
    
    if ( iBackgroundApi )
        {
        delete iBackgroundApi;
        }
    
#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)
    delete iSpSettings;
#endif // __VOIP && RD_VOIP_REL_2_2
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::InitializeCentralRepositoryL
//
// Creating and setting keys for the Central Repository
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::InitializeCentralRepositoryL()
    {
    iTelephonyRepository = CRepository::NewL( KCRUidTelephonySettings );
    iCommonTelephonyRepository = 
            CRepository::NewL( KCRUidCommonTelephonySettings );
    iGSVariationRepository = CRepository::NewL( KCRUidSettingsVariation );
    iRichCallRepository = CRepository::NewL( KCRUidRichCallSettings );
    iLogsRepository = CRepository::NewL( KCRUidLogs );
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::UninitializeCentralRepositoryL
//
// Removes Central Repository objects
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::UninitializeCentralRepository()
    {
    if ( iTelephonyRepository )
        {
        delete iTelephonyRepository;
        iTelephonyRepository = NULL;
        }
    if ( iCommonTelephonyRepository )
        {
        delete iCommonTelephonyRepository;
        iCommonTelephonyRepository = NULL;
        }
    if ( iGSVariationRepository )
        {
        delete iGSVariationRepository;
        iGSVariationRepository = NULL;
        }
    if ( iRichCallRepository )
        {
        delete iRichCallRepository;
        iRichCallRepository = NULL;
        }
    if ( iLogsRepository )
        {
        delete iLogsRepository;
        iLogsRepository = NULL;
        }
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::GetCallSettingValue
// Gets one of the call related values (anykey answer, automatic redial,
// summary after call or one key dialing) from Central Repository (Working OK)
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::GetCallSettingValue( const TCallSettId aCallId,
                                            TInt& aId )
    {
    TInt ret = KErrNone;
    if ( aCallId == EGSSummaryAfterCall )
        {
        ret = 
            iCommonTelephonyRepository->Get( KSettingsSummaryAfterCall, aId );
        }
    else
        {        
        switch ( aCallId )
            {     
            case EGSOpeningSlideAnswerCall:
                ret = iTelephonyRepository->
                    Get( KSettingsOpeningSlideAnswer, aId );
                break;
            case EGSClosingSlideEndCall:
                ret = iTelephonyRepository->
                    Get( KSettingsClosingSlideEnd, aId );
                break;            
            case EGSSoftRejectDefault:
                ret = iTelephonyRepository->
                   Get( KSettingsSoftRejectDefaultInUse, aId );
                break;
            default:
                break;
            };
        }
    return ret;
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetCallSettingValue
// Sets one of the call related values (anykey answer, automatic redial,
// summary after call or one key dialing) from Central Repository (working OK)
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::SetCallSettingValue( const TCallSettId aCallId,
                                            TInt aId )
    {
    TInt ret = KErrNone;
    if ( aCallId == EGSSummaryAfterCall )
        {
        ret = 
            iCommonTelephonyRepository->Set( KSettingsSummaryAfterCall, aId );
        }
    else
        {
        switch ( aCallId )
            {
            case EGSOpeningSlideAnswerCall:
                ret = iTelephonyRepository->
                    Set( KSettingsOpeningSlideAnswer, aId );
                break;
            case EGSClosingSlideEndCall:
                ret = iTelephonyRepository->
                    Set( KSettingsClosingSlideEnd, aId );
                break;    
            case EGSSoftRejectDefault:
                ret = iTelephonyRepository->
                    Set( KSettingsSoftRejectDefaultInUse, aId );
                break;
            default:
                break;
            };
        }
        
    return ret;
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::GetCSPStatus
// 
// Get Customer Service Profile status
// ----------------------------------------------------------------------------
//
TBool CGSCallPluginModel::GetCSPStatus()
    {
    if ( iCSP )
        {
        return ETrue;
        }
    else
        {
        return EFalse;
        }    
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetCSPActiveL
// 
// Set Customer Service Profile active
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SetCSPActiveL( TBool aValue )
    {
    if ( aValue )
        {
        iCSP = CPsetCustomerServiceProfile::NewL();
        User::LeaveIfError( iCSP->OpenCSProfileL() );
        }
    else
        {        
        delete iCSP;
        iCSP = NULL;
        }
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::IsSettingSupported
// 
// Check if a given setting is supported
// ----------------------------------------------------------------------------
//
TBool CGSCallPluginModel::IsSettingSupported( TInt aSettingNumber )
    {
    __ASSERT_ALWAYS( iCSP != NULL, User::Panic( KGSNameOfClass, 
                                   EGSCallPluinModelPanicNullPtr ) );
    TBool settingSupported = EFalse;
    TInt retVal = KErrNone;

    switch ( aSettingNumber )
        {
        case EGSCSPCallWaiting:
            retVal = iCSP->IsCWSupported( settingSupported );
            break;
        case EGSCSPAlternateLine:
            retVal = iCSP->IsALSSupported( settingSupported );
            break;
        default:
            break;
        }
    if ( retVal != KErrNone )
        {
        //if a CSP error occurs, by default service is available
        settingSupported = ETrue;
        }

    return settingSupported;
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::GetSoftRejectText
// Gets soft reject text from shared data.
// ----------------------------------------------------------------------------
//
TBool CGSCallPluginModel::GetSoftRejectText( TDes& aText )
    {
    TInt ret = iTelephonyRepository->Get( KSettingsSoftRejectText, aText );
    return ret;
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetSoftRejectText
// Sets user defined text to shared data for soft reject.
// ----------------------------------------------------------------------------
//
TBool CGSCallPluginModel::SetSoftRejectText( TDes& aText )
    {
    TInt ret = iTelephonyRepository->Set( KSettingsSoftRejectText, aText );
    return ret;
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::VTStillImageL
// 
// VT Still Image mode.
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::VTStillImageL()
    {
    TInt StImg = KGSSettingOff;
    
    User::LeaveIfError( iTelephonyRepository->Get( KSettingsVTStillImage, 
                                                   StImg ) );
    return StImg;
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetVTStillImageL
// 
// Sets VT Still Image mode to Shared Data
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SetVTStillImageL( const TInt aValue )
    {
    User::LeaveIfError( iTelephonyRepository->Set( KSettingsVTStillImage, 
                                                   aValue ) );
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::PrefixChangeModeL
// 
// Get the Japanese prefix change mode value from shared data.
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::PrefixChangeModeL()
    {
    TInt mode = KGSSettingOff;
    User::LeaveIfError( iTelephonyRepository->
                Get( KSettingsDialPrefixChangeMode, mode ) );
    SwitchValue( mode );
    return mode;
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetPrefixChangeModeL
// 
// Set the Japanese prefix change mode value to shared data. CenRep OK
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SetPrefixChangeModeL( TInt aMode )
    {
    SwitchValue( aMode );
    User::LeaveIfError( iTelephonyRepository->
                Set( KSettingsDialPrefixChangeMode, aMode ) );
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::PrefixChangeDataL
// 
// Reads prefix change text from shared data and returns it
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::PrefixChangeDataL( TDes& aText )
    {
    User::LeaveIfError( iTelephonyRepository->
                Get( KSettingsDialPrefixText, aText ) );
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetPrefixChangeDataL
// 
// Writes prefix change text to shared data
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SetPrefixChangeDataL( const TDesC& aText )
    {
    User::LeaveIfError( iTelephonyRepository->
                Set( KSettingsDialPrefixText, aText ) );
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::SwitchValue
// 
// Switching value from 1 to 0 and back
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SwitchValue( TInt& aValue )
    {
    switch( aValue )   
        {
        case KGSSettingOff: //0
            aValue = KGSIndexOff; //1
            break;
        case KGSSettingOn: //1
            aValue = KGSIndexOn; //0
            break;
        default:
            aValue = KErrNotFound;
        };
    }


// ---------------------------------------------------------
// CGSCallPluginModel::RestrictedSendCallerIdSupportedL
// 
// Check if Restricted Send Caller ID is supported.
// ---------------------------------------------------------
//
TBool CGSCallPluginModel::RestrictedSendCallerIdSupportedL()
    {
    TBool supported = EFalse;    

    if ( iLocalVariationValues & EGSConfigRestrictedSendCallerId )
        {
        supported = ETrue;
        }

    return supported;

    }

// ---------------------------------------------------------
// CGSCallPluginModel::SecureSendCallerIdSupportedL
// 
// Check if Secure Send Caller ID is supported.
// ---------------------------------------------------------
//
TBool CGSCallPluginModel::SecureSendCallerIdSupportedL()
    {
    TBool supported = EFalse;    

    if ( iLocalVariationValues & EGSConfigSecureSendCallerId )
        {
        supported = ETrue;
        }

    return supported;

    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::GetVoIPCallSettingValue
// Gets one of the VoIP call related values (send my Int. call id, 
// Internet call waiting, preferred call type, do not disturb or 
// Internet call barring) from Central Repository
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::GetVoIPCallSettingValue( 
    const TGSVoIPSetting aVoipSettingId, TInt& aVoipId ) 
    {
    TInt ret( KErrNone );
   
    switch ( aVoipSettingId )
        {
        case EGSVoIPSendIntCallId:
            ret = iRichCallRepository->Get( KRCSEClir, aVoipId );
            break;
        case EGSVoIPCW:
            ret = iRichCallRepository->Get( KRCSPSCallWaiting, aVoipId );
            break;
        case EGSVoIPPreType:
            ret = iRichCallRepository->Get( KRCSEPreferredTelephony, aVoipId );
            break;
        case EGSVoIPDnd:
            ret = iRichCallRepository->Get( KRCSEDoNotDisturb, aVoipId );
            break;
        case EGSVoIPBarring:
            ret = iRichCallRepository->Get( KRCSEAnonymousCallBlockRule, aVoipId );
            break;
        default:
            break;
        }
    
    return ret;
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetVoIPCallSettingValue
// Sets one of the VoIP call related values (send my Int. call id, 
// Internet call waiting, preferred call type, do not disturb or 
// Internet call barring) from Central Repository
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::SetVoIPCallSettingValue( 
    const TGSVoIPSetting aVoipSettingId, TInt aVoipId )
    {
    TInt ret( KErrNone );
    
    switch( aVoipSettingId )
        {
        case EGSVoIPSendIntCallId:
            ret = iRichCallRepository->Set( KRCSEClir, aVoipId );
            break;
        case EGSVoIPCW:
            ret = iRichCallRepository->Set( KRCSPSCallWaiting, aVoipId );
            break;
        case EGSVoIPPreType:
            ret = iRichCallRepository->Set( KRCSEPreferredTelephony, aVoipId );
            break;
        case EGSVoIPDnd:
            ret = iRichCallRepository->Set( KRCSEDoNotDisturb, aVoipId );
            break;
        case EGSVoIPBarring:
            ret = iRichCallRepository->Set( KRCSEAnonymousCallBlockRule, aVoipId );
            break;
        default:
            break;
        }
        
    return ret;    
    }
    
// ----------------------------------------------------------------------------
// CGSCallPluginModel::GetSCCPStatus
// Gets SCCP status from Central Repository
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::GetSCCPStatus( TInt& aStatus )
    {
    TInt ret( KErrNone );
    ret = iTelephonyRepository->Get( KSCCPinstallUpgrade, aStatus );
    return ret;
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::CallDurationL
// 
// Get the Call duration setting value
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::CallDurationL()
    {
    TInt value = KGSSettingOff;
    User::LeaveIfError( iLogsRepository->
                Get( KLogsShowCallDuration, value ) );
    
	SwitchValue ( value );

    return value;
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetCallDurationL
// 
// Set the Call duration setting value
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SetCallDurationL( TInt aValue )
    {
    SwitchValue ( aValue );
    User::LeaveIfError( iLogsRepository->
                Set( KLogsShowCallDuration, aValue ) );
    }

// ---------------------------------------------------------
// CGSTelPluginModel::VoIPSupported
// 
// Check if VoIP is supported.
// ---------------------------------------------------------
//    
TBool CGSCallPluginModel::VoIPSupported()
    {
    TInt supported( KGSSettingOff );
#if defined(__VOIP) && defined(RD_VOIP_REL_2_2)
    if ( iSpSettings->IsFeatureSupported( ESupportVoIPFeature ) &&
        iSpSettings->IsFeatureSupported( ESupportVoIPSSFeature ) )
        {
        supported = KGSSettingOn;
        }
#else // __VOIP && RD_VOIP_REL_2_2
    if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) )
        {
        iTelephonyRepository->Get( KDynamicVoIP, supported );
        }
#endif // __VOIP && RD_VOIP_REL_2_2
    return KGSSettingOff != supported;
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::LongPressCallKeyL
// 
// Get the Long Press Call Key setting value
// 0,1 --> Inactive (Default value is 1 and when RFS Default value is 0) 
// 2 --> Video call
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::LongPressCallKeyL()
    {
    TInt value = EGSLongPressCallKeyVoiceCall;
  #ifdef RD_VT_LONG_SEND_KEY
    User::LeaveIfError( iTelephonyRepository->
                Get( KSettingsUiLongCallKeyPress, value ) );
  #endif
    return value;
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetLongPressCallKeyL
// 
// Set the Long Press Call Key setting value
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SetLongPressCallKeyL( const TInt aValue )
    {
#ifdef RD_VT_LONG_SEND_KEY
    User::LeaveIfError( iTelephonyRepository->
                Set( KSettingsUiLongCallKeyPress, aValue ) );
#endif
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::MapLongPressKeyCallKeyValue
// 
// Maps the Long Press Call Key setting value
// NOTE : EGSLongPressCallKeyVoiceCall is the default value normally
// NOTE: When Restore Factory Settings is done, the default value 
//       is set to EGSLongPressCallKeyInActive
// Three key values are used for a CenRep key though we have two
// two setting items because these values are also been used by
// CallUi and Phone Application.
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::MapLongPressKeyCallKeyValue( TInt &aValue )
    {
#ifdef RD_VT_LONG_SEND_KEY
  	switch ( aValue )
  		{
  		case EGSLongPressCallKeyVoiceCall:
  			 aValue = EGSLongPressCallKeyNotSet;
  			 break;
  		case EGSLongPressCallKeyVideoCall:
  		     aValue = EGSLongPressCallKeyVoiceCall;
  			 break;
  		default:
  			 break;
  		}
#endif
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::OwnImageVtCallStatusL
// 
// Get the Own Image sending during vt call setting value
// 0,1 --> Inactive (Default value is 1 and when RFS Default value is 0) 
// 2 --> Video call
// ----------------------------------------------------------------------------
//
TInt CGSCallPluginModel::OwnImageVtCallStatusL()
    {
    TInt value;
    User::LeaveIfError( iTelephonyRepository->
                Get( KSettingsVTVideoSending, value ) );
    return value;
    }

// ----------------------------------------------------------------------------
// CGSCallPluginModel::SetOwnImageVtCallStatusL
// 
// Set the Long Press Call Key setting value
// ----------------------------------------------------------------------------
//
void CGSCallPluginModel::SetOwnImageVtCallStatusL( const TInt aValue )
    {
    User::LeaveIfError( iTelephonyRepository->
                Set( KSettingsVTVideoSending, aValue ) );
    }


// ----------------------------------------------------------------------------
// CGSCallPluginModel::SlideSettingsShown
// 
// Check if slide settings items should be shown
// ----------------------------------------------------------------------------
//
TBool CGSCallPluginModel::SlideSettingsShownL() const
    {
    TInt value( EGSNotShowSlideSettings );
    
    User::LeaveIfError( 
            iTelephonyRepository->Get( KSettingsShowSlideSettings,value ) );

    if ( EGSShowSlideSettings == value )
        {
        return ETrue;
        }
    else
        {
        return EFalse;
        }
    }

//  End of File