sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include "featdiscoveryimpl.h" sl@0: #include "featurecontrol.h" sl@0: #include "featurecmn.h" sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::CFeatureDiscoveryImpl* NewL() sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CFeatureDiscoveryImpl* CFeatureDiscoveryImpl::NewL() sl@0: { sl@0: CFeatureDiscoveryImpl* self = new( ELeave ) CFeatureDiscoveryImpl(); sl@0: CleanupStack::PushL( self ); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop( self ); sl@0: sl@0: return self; sl@0: } sl@0: sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::ConstructL sl@0: // sl@0: // Symbian OS default constructor, initializes variables and cache sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CFeatureDiscoveryImpl::ConstructL() sl@0: { sl@0: TInt err( iFeatControl.Connect() ); sl@0: User::LeaveIfError( err ); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::~CFeatureDiscoveryImpl() sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CFeatureDiscoveryImpl::~CFeatureDiscoveryImpl() sl@0: { sl@0: iFeatControl.Close(); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::CFeatureDiscoveryImpl() sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CFeatureDiscoveryImpl::CFeatureDiscoveryImpl() sl@0: { sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::IsFeatureSupportedL(TUid) sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TBool CFeatureDiscoveryImpl::IsFeatureSupportedL(TUid aFeature) sl@0: { sl@0: RFeatureControl featControl; sl@0: TInt err( featControl.Connect() ); sl@0: User::LeaveIfError( err ); sl@0: TFeatureEntry feature( aFeature ); sl@0: err = featControl.FeatureSupported( feature ); sl@0: featControl.Close(); sl@0: sl@0: return (( err > 0 ) ? ETrue : EFalse ); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::IsSupported(TUid) sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TBool CFeatureDiscoveryImpl::IsSupported(TUid aFeature) sl@0: { sl@0: TFeatureEntry feature( aFeature ); sl@0: sl@0: return (( iFeatControl.FeatureSupported( feature ) > 0 ) ? ETrue : EFalse ); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::FeaturesSupportedL(TFeatureSet&) sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CFeatureDiscoveryImpl::FeaturesSupportedL( TFeatureSet& aFeatures ) sl@0: { sl@0: RFeatureControl featControl; sl@0: CleanupClosePushL( featControl ); sl@0: TInt err( featControl.Connect() ); sl@0: User::LeaveIfError( err ); sl@0: sl@0: // Construct feature entry array used by feature control sl@0: RFeatureArray features; sl@0: CleanupClosePushL( features ); sl@0: TInt count( aFeatures.Count() ); sl@0: sl@0: for(TInt i(0); i < count; i++) sl@0: { sl@0: TFeatureEntry feature( aFeatures.FeatureId( i ) ); sl@0: features.AppendL( feature ); sl@0: } sl@0: sl@0: // Fetch feature information from server sl@0: err = featControl.FeaturesSupported( features ); sl@0: User::LeaveIfError( err ); sl@0: sl@0: // Refresh count of features after query, non existing features are removed sl@0: count = features.Count(); sl@0: // Write information back to format feature discovery uses sl@0: aFeatures.Reset(); sl@0: sl@0: for(TInt i(0); i < count; i++) sl@0: { sl@0: const TUid uid( features[i].FeatureUid() ); sl@0: const TBool supported( features[i].FeatureFlags().IsSet( EFeatureSupported ) ); sl@0: err = aFeatures.Append( uid, supported ); sl@0: User::LeaveIfError( err ); sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy( &features ); sl@0: CleanupStack::PopAndDestroy( &featControl ); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CFeatureDiscoveryImpl::FeaturesSupported(TFeatureSet&) sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CFeatureDiscoveryImpl::FeaturesSupported( TFeatureSet& aFeatures ) sl@0: { sl@0: // Construct feature entry array used by feature control sl@0: TInt err( KErrNone ); sl@0: RFeatureArray features; sl@0: TInt count( aFeatures.Count() ); sl@0: sl@0: for(TInt i(0); i < count; i++) sl@0: { sl@0: TFeatureEntry feature( aFeatures.FeatureId( i ) ); sl@0: err = features.Append( feature ); sl@0: if( err != KErrNone ) sl@0: { sl@0: break; sl@0: } sl@0: } sl@0: sl@0: if( err == KErrNone ) sl@0: { sl@0: // Fetch feature information from server sl@0: err = iFeatControl.FeaturesSupported( features ); sl@0: // Refresh count of features after query, non existing features are removed sl@0: count = features.Count(); sl@0: } sl@0: sl@0: if( err == KErrNone ) sl@0: { sl@0: // Write information back to format feature discovery uses sl@0: aFeatures.Reset(); sl@0: sl@0: for(TInt i(0); i < count; i++) sl@0: { sl@0: const TUid uid( features[i].FeatureUid() ); sl@0: const TBool supported( features[i].FeatureFlags().IsSet( EFeatureSupported ) ); sl@0: err = aFeatures.Append( uid, supported ); sl@0: if( err != KErrNone ) sl@0: { sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: features.Close(); sl@0: return err; sl@0: } sl@0: // EOF