--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/featuremgmt/featuremgr/src/featdiscovery/featdiscoveryimpl.cpp Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,191 @@
+// Copyright (c) 2007-2009 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:
+//
+
+
+
+#include <e32cmn.h>
+#include <featdiscovery.h>
+#include "featdiscoveryimpl.h"
+#include "featurecontrol.h"
+#include "featurecmn.h"
+
+// -----------------------------------------------------------------------------
+// CFeatureDiscoveryImpl::CFeatureDiscoveryImpl* NewL()
+// -----------------------------------------------------------------------------
+//
+CFeatureDiscoveryImpl* CFeatureDiscoveryImpl::NewL()
+ {
+ CFeatureDiscoveryImpl* self = new( ELeave ) CFeatureDiscoveryImpl();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+
+
+// ---------------------------------------------------------
+// CFeatureDiscoveryImpl::ConstructL
+//
+// Symbian OS default constructor, initializes variables and cache
+// ---------------------------------------------------------
+//
+void CFeatureDiscoveryImpl::ConstructL()
+ {
+ TInt err( iFeatControl.Connect() );
+ User::LeaveIfError( err );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CFeatureDiscoveryImpl::~CFeatureDiscoveryImpl()
+// -----------------------------------------------------------------------------
+//
+CFeatureDiscoveryImpl::~CFeatureDiscoveryImpl()
+ {
+ iFeatControl.Close();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CFeatureDiscoveryImpl::CFeatureDiscoveryImpl()
+// -----------------------------------------------------------------------------
+//
+CFeatureDiscoveryImpl::CFeatureDiscoveryImpl()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CFeatureDiscoveryImpl::IsFeatureSupportedL(TUid)
+// -----------------------------------------------------------------------------
+//
+TBool CFeatureDiscoveryImpl::IsFeatureSupportedL(TUid aFeature)
+ {
+ RFeatureControl featControl;
+ TInt err( featControl.Connect() );
+ User::LeaveIfError( err );
+ TFeatureEntry feature( aFeature );
+ err = featControl.FeatureSupported( feature );
+ featControl.Close();
+
+ return (( err > 0 ) ? ETrue : EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+// CFeatureDiscoveryImpl::IsSupported(TUid)
+// -----------------------------------------------------------------------------
+//
+TBool CFeatureDiscoveryImpl::IsSupported(TUid aFeature)
+ {
+ TFeatureEntry feature( aFeature );
+
+ return (( iFeatControl.FeatureSupported( feature ) > 0 ) ? ETrue : EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+// CFeatureDiscoveryImpl::FeaturesSupportedL(TFeatureSet&)
+// -----------------------------------------------------------------------------
+//
+void CFeatureDiscoveryImpl::FeaturesSupportedL( TFeatureSet& aFeatures )
+ {
+ RFeatureControl featControl;
+ CleanupClosePushL( featControl );
+ TInt err( featControl.Connect() );
+ User::LeaveIfError( err );
+
+ // Construct feature entry array used by feature control
+ RFeatureArray features;
+ CleanupClosePushL( features );
+ TInt count( aFeatures.Count() );
+
+ for(TInt i(0); i < count; i++)
+ {
+ TFeatureEntry feature( aFeatures.FeatureId( i ) );
+ features.AppendL( feature );
+ }
+
+ // Fetch feature information from server
+ err = featControl.FeaturesSupported( features );
+ User::LeaveIfError( err );
+
+ // Refresh count of features after query, non existing features are removed
+ count = features.Count();
+ // Write information back to format feature discovery uses
+ aFeatures.Reset();
+
+ for(TInt i(0); i < count; i++)
+ {
+ const TUid uid( features[i].FeatureUid() );
+ const TBool supported( features[i].FeatureFlags().IsSet( EFeatureSupported ) );
+ err = aFeatures.Append( uid, supported );
+ User::LeaveIfError( err );
+ }
+
+ CleanupStack::PopAndDestroy( &features );
+ CleanupStack::PopAndDestroy( &featControl );
+ }
+
+// -----------------------------------------------------------------------------
+// CFeatureDiscoveryImpl::FeaturesSupported(TFeatureSet&)
+// -----------------------------------------------------------------------------
+//
+TInt CFeatureDiscoveryImpl::FeaturesSupported( TFeatureSet& aFeatures )
+ {
+ // Construct feature entry array used by feature control
+ TInt err( KErrNone );
+ RFeatureArray features;
+ TInt count( aFeatures.Count() );
+
+ for(TInt i(0); i < count; i++)
+ {
+ TFeatureEntry feature( aFeatures.FeatureId( i ) );
+ err = features.Append( feature );
+ if( err != KErrNone )
+ {
+ break;
+ }
+ }
+
+ if( err == KErrNone )
+ {
+ // Fetch feature information from server
+ err = iFeatControl.FeaturesSupported( features );
+ // Refresh count of features after query, non existing features are removed
+ count = features.Count();
+ }
+
+ if( err == KErrNone )
+ {
+ // Write information back to format feature discovery uses
+ aFeatures.Reset();
+
+ for(TInt i(0); i < count; i++)
+ {
+ const TUid uid( features[i].FeatureUid() );
+ const TBool supported( features[i].FeatureFlags().IsSet( EFeatureSupported ) );
+ err = aFeatures.Append( uid, supported );
+ if( err != KErrNone )
+ {
+ break;
+ }
+ }
+ }
+
+ features.Close();
+ return err;
+ }
+// EOF