convergedcallengine/spsettings/src/spsettings.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 20 987c9837762f
parent 0 ff3b6d0fd310
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c)  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:  Service Provider Settings API implementation file.
*
*/

#include <e32property.h>
#include <e32cmn.h>
#include <featmgr.h>

#include "spsettings.h"
#include "spsettingsengine.h"
#include "spentry.h"
#include "spproperty.h"
#include "spdefinitions.h"
#include "spdefaultvalues.h"
#include "spsbufferedpublisher.h"
#include "spsapilogger.h" // For logging

_LIT( KSIPVoIPSWVersion, "3.1" );

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

// ---------------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------------
//
CSPSettings::CSPSettings() : iSettingsWriteAllowed( ETrue )
    {
    }


// ---------------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------------
//
void CSPSettings::ConstructL()
    {
    XSPSLOGSTRING( "CSPSettings::ConstructL() - IN" );

    iSettingsEngine = CSPSettingsEngine::NewL();
    
    static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);

    TInt err =  RProperty::Define( KUidSystemCategory, KSPSupportInternetCallKey, 
        RProperty::EInt, KAllowAllPolicy, KAllowAllPolicy);
    if( err == KErrNone )
        {
        RProperty::Set( KUidSystemCategory, KSPSupportInternetCallKey, 
            KSPInitFeatureValue );
        }
    else if ( KErrPermissionDenied == err )
        {
        iSettingsWriteAllowed = EFalse;
        }
    else if( err != KErrAlreadyExists )
        {
        User::LeaveIfError( err );
        }

    err =  RProperty::Define( KUidSystemCategory, KSPSupportCallOutKey,
        RProperty::EInt, KAllowAllPolicy, KAllowAllPolicy);
    if( err == KErrNone )
        {
        RProperty::Set( KUidSystemCategory, KSPSupportCallOutKey, 
            KSPInitFeatureValue );
        }
    else if ( KErrPermissionDenied == err )
        {
        iSettingsWriteAllowed = EFalse;
        }
    else if( err != KErrAlreadyExists )
        {
        User::LeaveIfError( err );
        }

    err =  RProperty::Define( KUidSystemCategory, KSPSupportVoIPSSKey, 
        RProperty::EInt, KAllowAllPolicy, KAllowAllPolicy);
    if( err == KErrNone )
        {
        RProperty::Set( KUidSystemCategory, KSPSupportVoIPSSKey, 
            KSPInitFeatureValue );
        }
    else if ( KErrPermissionDenied == err )
        {
        iSettingsWriteAllowed = EFalse;
        }
    else if( err != KErrAlreadyExists )
        {
        User::LeaveIfError( err );
        }
        
    FeatureManager::InitializeLibL();
    iFeatureManagerSupportVoIP = FeatureManager::FeatureSupported( 
        KFeatureIdCommonVoip );
    FeatureManager::UnInitializeLib();

    XSPSLOGSTRING( "CSPSettings::ConstructL() - OUT" );
    }

// ---------------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------------
//
EXPORT_C CSPSettings* CSPSettings::NewL()
    {
    CSPSettings* self = CSPSettings::NewLC();
    CleanupStack::Pop( self );
    return self;
    }


// ---------------------------------------------------------------------------
// Constructor
// ---------------------------------------------------------------------------
//
EXPORT_C CSPSettings* CSPSettings::NewLC()
    {
    CSPSettings* self = new( ELeave ) CSPSettings;
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }


// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
EXPORT_C CSPSettings::~CSPSettings()
    {
    XSPSLOGSTRING( "CSPSettings::~CSPSettings() - IN" );

    delete iSettingsEngine;

    XSPSLOGSTRING( "CSPSettings::~CSPSettings() - OUT" );
    }


// ---------------------------------------------------------------------------
// Stores new service provider settings entry
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::AddEntryL( CSPEntry& aEntry )
    {
    XSPSLOGSTRING( "CSPSettings::AddEntryL() - IN" );
    
    TInt err = KErrPermissionDenied;
    if( iSettingsWriteAllowed )
        {        
        const RPropertyArray& propertyArray = aEntry.GetAllProperties();
        err = CheckSupportedL( propertyArray );
        
        // continue 
        if( err == KErrNone )
            {
            TInt err( iSettingsEngine->BeginTransactionLC() );
            if( err != KErrNone )
                {
                return err;
                }
                
            iSettingsEngine->AddEntryL( aEntry );
            err = iSettingsEngine->CommitTransaction();
            
            if( err == KErrNone )
                {
                // update p&s key for feature checking
                iSettingsEngine->UpdateSupportFeaturePSKeyL();

                // update p&s key for service change notify
                CSpsBufferedPublisher::SetL( 
                    KUidSystemCategory, KSPNotifyChangeKey, aEntry.GetServiceId() );

                }
            }
        }
        
    XSPSLOGSTRING( "CSPSettings::AddEntryL() - OUT" );
    return err;
    }


// ---------------------------------------------------------------------------
// Find service provider settings entry by service ID
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::FindEntryL( TServiceId aServiceId, 
    CSPEntry& aEntry )
    {
    XSPSLOGSTRING2( "CSPSettings::FindEntryL( %d ) - IN", aServiceId );
    
    TInt err = CheckSupportedL( aServiceId );

    // continue        
    if( err == KErrNone )
        {
        err = iSettingsEngine->FindEntryL( aServiceId, aEntry );
        }

    XSPSLOGSTRING2( "CSPSettings::FindEntryL( %d ) - OUT", aServiceId );
    return err;
    }


// ---------------------------------------------------------------------------
// Update existing service provider settings entry
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::UpdateEntryL( const CSPEntry& aEntry )
    {
    XSPSLOGSTRING( "CSPSettings::UpdateEntry() - IN" );
    
    TInt err = KErrPermissionDenied;
    if( iSettingsWriteAllowed )
        {
        const RPropertyArray& propertyArray = aEntry.GetAllProperties();
        RPropertyNameArray nameArray;
        CleanupClosePushL( nameArray );
        iSettingsEngine->NameArrayFromPropertyArrayL( 
            nameArray, propertyArray );

        err = CheckSupportedL( aEntry.GetServiceId(), nameArray );
        CleanupStack::PopAndDestroy( &nameArray );
        
        // continue
        if( err == KErrNone )
            {
            err = iSettingsEngine->BeginTransactionLC();
            if( err != KErrNone )
                {
                return err;
                }
            
            TInt result( iSettingsEngine->UpdateEntryL( aEntry ) );
            err = CommitOrRollbackL( result, aEntry.GetServiceId() );
            }
        }
    XSPSLOGSTRING( "CSPSettings::UpdateEntry() - OUT" );
    return err;
    }


// ---------------------------------------------------------------------------
// Deletes service provider settings entry by service ID
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::DeleteEntryL( TServiceId aServiceId )
    {
    XSPSLOGSTRING2( "CSPSettings::DeleteEntry(%d) - IN", aServiceId );

    TInt err = KErrPermissionDenied;
    if( iSettingsWriteAllowed )
        {    
        err = CheckSupportedL( aServiceId );
        
        if( err == KErrNone )
            {
            err = iSettingsEngine->BeginTransactionLC();
            if( err != KErrNone )
                {
                return err;
                }

            TInt result( iSettingsEngine->DeleteEntryL( aServiceId ) );
            err = CommitOrRollbackL( result, aServiceId );
            }
        }        
    XSPSLOGSTRING2( "CSPSettings::DeleteEntry(%d) - OUT", aServiceId );
    return err;
    }


// ---------------------------------------------------------------------------
// Search property of service provider settings entry by property name
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::FindPropertyL( TServiceId aServiceId, 
    TServicePropertyName aPropertyName, CSPProperty& aProperty )
    {
    XSPSLOGSTRING2( "CSPSettings::FindPropertyL(%d) - IN", aServiceId );

    RPropertyNameArray nameArray;
    CleanupClosePushL( nameArray );
    
    User::LeaveIfError( nameArray.Append( aPropertyName ) );
    
    TInt err = CheckSupportedL( aServiceId, nameArray );
    CleanupStack::PopAndDestroy( &nameArray );
    
    if( err == KErrNone )
        {
        err = iSettingsEngine->FindPropertyL( aServiceId, aPropertyName,
            aProperty );
        }
    
    XSPSLOGSTRING2( "CSPSettings::FindPropertyL(%d) - OUT", aServiceId );
    return err;
    }


// ---------------------------------------------------------------------------
// Add or update properties
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::AddOrUpdatePropertiesL( TServiceId aServiceId,
    const RPropertyArray& aPropertyArray )
    {
    XSPSLOGSTRING2( "CSPSettings::AddOrUpdateProperties(%d) - IN",
        aServiceId );
    TInt err = KErrPermissionDenied;
    if( iSettingsWriteAllowed )
        {
        RPropertyNameArray nameArray;
        CleanupClosePushL( nameArray );
        iSettingsEngine->NameArrayFromPropertyArrayL( 
            nameArray, aPropertyArray );

        err = CheckSupportedL( aServiceId, nameArray );
        CleanupStack::PopAndDestroy( &nameArray );
        
        // continue
        if( err == KErrNone )
            {
            TInt err( iSettingsEngine->BeginTransactionLC() );
            if( err != KErrNone )
                {
                return err;
                }

            TInt result( iSettingsEngine->AddOrUpdatePropertiesL( 
                aServiceId, aPropertyArray ) );
            err = CommitOrRollbackL( result, aServiceId );
            }
        }
    XSPSLOGSTRING2( "CSPSettings::AddOrUpdateProperties(%d) - OUT",
        aServiceId );
    return err;
    }

// ---------------------------------------------------------------------------
// Add or update property
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::AddOrUpdatePropertyL( TServiceId aServiceId,
    const CSPProperty& aProperty )
    {
    XSPSLOGSTRING2( "CSPSettings::AddOrUpdatePropertyL(%d) - IN", aServiceId );
    TInt err = KErrPermissionDenied;
    if( iSettingsWriteAllowed )
        {
        RPropertyArray array;
        CleanupClosePushL( array );
        User::LeaveIfError( array.Append( &aProperty ) );
        err = AddOrUpdatePropertiesL( aServiceId, array );
        
        CleanupStack::PopAndDestroy( &array );
        }
    XSPSLOGSTRING2( "CSPSettings::AddOrUpdatePropertyL(%d) - OUT", aServiceId );
    return err;
    }


// ---------------------------------------------------------------------------
// Returns count of stored service provider settings entries
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::SettingsCountL()
    {
    XSPSLOGSTRING( "CSPSettings::SettingsCount() - IN" );

    TInt result( iSettingsEngine->SettingsCountL() );
    
    XSPSLOGSTRING2( "CSPSettings::SettingsCount(%d) - OUT", result );
    
    return result;
    }


// ---------------------------------------------------------------------------
// Search stored service IDs of service provider settings entries
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::FindServiceIdsL( RIdArray& aServiceIds )
    {
    XSPSLOGSTRING( "CSPSettings::FindServiceIdsL() - IN" );

    TInt err( iSettingsEngine->FindServiceIdsL( aServiceIds ) );
    
    XSPSLOGSTRING( "CSPSettings::FindServiceIdsL() - OUT" );
    
    return err;
    }


// ---------------------------------------------------------------------------
// Search service names by given service IDs
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::FindServiceNamesL( RIdArray& aServiceIds, 
    CDesCArray& aServiceNames )
    {
    XSPSLOGSTRING( "CSPSettings::FindServiceNames() - IN" );

    iSettingsEngine->FindServiceNamesL( aServiceIds, aServiceNames );

    XSPSLOGSTRING( "CSPSettings::FindServiceNames() - OUT" );

    return KErrNone;
    }




// ---------------------------------------------------------------------------
// Search certain subservice properties
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::FindSubServicePropertiesL( TServiceId aServiceId,
    TSPItemType aPropertyType, RPropertyArray& aPropertyArray )
    {
    XSPSLOGSTRING( "CSPSettings::FindSubServiceProperties() - IN" );

    TInt err = CheckSupportedL( aPropertyType );

    // continue        
    if( err == KErrNone )
        {
        err = iSettingsEngine->FindSubServicePropertiesL( aServiceId, 
            aPropertyType, aPropertyArray );
        }

    XSPSLOGSTRING( "CSPSettings::FindSubServiceProperties() - OUT" );
    return err;
    }



// ---------------------------------------------------------------------------
// Deletes service properties by service ID and property name
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::DeleteServicePropertiesL( TServiceId aServiceId, 
    const RPropertyNameArray& aNameArray )
    {
    XSPSLOGSTRING( "CSPSettings::DeleteServiceProperties() - IN" );
    
    TInt err = KErrPermissionDenied;
    if( iSettingsWriteAllowed )
        {
        err = CheckSupportedL( aServiceId, aNameArray );
        
        // continue
        if( err == KErrNone )
            {
            err = iSettingsEngine->BeginTransactionLC();
            if( err != KErrNone )
                {
                return err;
                }
            
            TInt result( iSettingsEngine->DeleteServicePropertiesL( aServiceId, aNameArray ) );
            err = CommitOrRollbackL( result, aServiceId );
            }
        }
    XSPSLOGSTRING( "CSPSettings::DeleteServiceProperties() - OUT" );
    return err;
    }

// ---------------------------------------------------------------------------
// Find service IDs with same properties
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CSPSettings::FindServiceIdsFromPropertiesL( 
    const RPropertyArray& aPropertyArray, RIdArray& aServiceIds )
    {
    XSPSLOGSTRING( "CSPSettings::FindServiceIdsFromProperties() - IN" );
    
    TInt err = CheckSupportedL( aPropertyArray );
        
    // continue 
    if( err == KErrNone )
        {
        iSettingsEngine->FindServiceIdsFromPropertiesL( aPropertyArray, 
            aServiceIds );
        }
        
    XSPSLOGSTRING( "CSPSettings::FindServiceIdsFromProperties() - OUT" );
    return err;
    }
    
// ---------------------------------------------------------------------------
// Get SIP VoIP software version
// ---------------------------------------------------------------------------
//
EXPORT_C const TDesC& CSPSettings::GetSIPVoIPSWVersion()
    {
    return KSIPVoIPSWVersion;
    }

// ---------------------------------------------------------------------------
// Commit or rollback transaction
// ---------------------------------------------------------------------------
//
TInt CSPSettings::CommitOrRollbackL( TInt aError, TServiceId aServiceId )
    {
    TInt err = KErrNone;
    
    if( aError != KErrNone )
        {
        iSettingsEngine->RollbackTransaction();
        err = aError;
        }
    else
        {
        err = iSettingsEngine->CommitTransaction();
        if( err == KErrNone )
            {
            // update p&s key for feature checking
            iSettingsEngine->UpdateSupportFeaturePSKeyL();

            // update p&s key for service change notify
            CSpsBufferedPublisher::SetL(
                KUidSystemCategory, KSPNotifyChangeKey, aServiceId );
            }
        
        }
        
    return err;
    }

// ---------------------------------------------------------------------------
// Check feature is supported or not
// ---------------------------------------------------------------------------
//
EXPORT_C TBool CSPSettings::IsFeatureSupported( TSPServiceFeature aFeature )
    {
    XSPSLOGSTRING( "CSPSettings::IsFeatureSupported() - IN" );

    TBool ret = EFalse;
    TRAP_IGNORE( ret = iSettingsEngine->IsFeatureSupportedL( 
        aFeature, iSettingsWriteAllowed ) );
    
    XSPSLOGSTRING( "CSPSettings::IsFeatureSupported() - OUT" );
    
    return ret;
    }

    
// ---------------------------------------------------------------------------
// Check feature is supported or not
// ---------------------------------------------------------------------------
//
TInt CSPSettings::CheckSupportedL( TServiceId aServiceId, 
    const RPropertyNameArray& aNameArray )
    {
    TInt err ( KErrNone );
    if( !iFeatureManagerSupportVoIP )
        {
        TBool bIsVoIP = iSettingsEngine->IsVoIPServiceL( aServiceId );

        if( bIsVoIP )
            {
            TBool bRestricted = 
                iSettingsEngine->HasCallPropertyName( aNameArray ) || 
                iSettingsEngine->HasVoIPAndVmbxPropertyName( aNameArray );
            
            if( bRestricted )
                {
                err = KErrNotSupported;
                }
            }
        else
            {
            TBool bHasVoIPAndVmbx = 
                iSettingsEngine->HasVoIPAndVmbxPropertyName( aNameArray );
            if( bHasVoIPAndVmbx )
                {
                err = KErrNotSupported;
                }
            }
        }
        
    return err;
    }
    

// ---------------------------------------------------------------------------
// Check feature is supported or not 
// ---------------------------------------------------------------------------
//
TInt CSPSettings::CheckSupportedL( TServiceId aServiceId )
    {
    TInt err = KErrNone;

    if( !iFeatureManagerSupportVoIP )
        {
        TBool bIsVoIP = iSettingsEngine->IsVoIPServiceL( aServiceId );
        if( bIsVoIP )
            {
            err = KErrNotSupported;
            }
        }
        
    return err;
    }

// ---------------------------------------------------------------------------
// Check feature is supported or not 
// ---------------------------------------------------------------------------
//
TInt CSPSettings::CheckSupportedL( TSPItemType aPropertyType )
    {
    TInt err = KErrNone;

    if ( !iFeatureManagerSupportVoIP ) 
        {
        if ( aPropertyType == EItemTypeVoIPSubProperty || 
            aPropertyType == EItemTypeVMBXSubProperty )
            {
            err = KErrNotSupported;
            }
        }
        
    return err;
    }
    

// ---------------------------------------------------------------------------
// Check feature is supported or not 
// ---------------------------------------------------------------------------
//
TInt CSPSettings::CheckSupportedL( const RPropertyArray& aPropertyArray )
    {
    TInt err ( KErrNone );
    
    if( !iFeatureManagerSupportVoIP )
        {
        RPropertyNameArray nameArray;
        CleanupClosePushL( nameArray );
        iSettingsEngine->NameArrayFromPropertyArrayL( 
            nameArray, aPropertyArray );
        
        TBool bHasVoIPAndVmbx = 
            iSettingsEngine->HasVoIPAndVmbxPropertyName( nameArray );
        if( bHasVoIPAndVmbx )
            {
            err = KErrNotSupported;
            }
        CleanupStack::PopAndDestroy( &nameArray );
        }

    return err;
    }