--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sensorservices/orientationssy/src/SsyProperty.cpp Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,389 @@
+/*
+* Copyright (c) 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: Property class of Orientation SSY
+*
+*/
+
+
+// Includes
+#include "SsyConfiguration.h"
+#include "SsyProperty.h"
+#include "SsyTrace.h"
+
+
+// ----------------------------------------------------------------------------------
+// FindMatchingProperty()
+// Helper function for find a matching property in an array.
+// ----------------------------------------------------------------------------------
+//
+TBool FindMatchingProperty
+ ( const TSSyChannelProperties& aLeft,
+ const TSSyChannelProperties& aRight )
+ {
+ if ( ( aLeft.iPropertyId == aRight.iPropertyId ) &&
+ ( aLeft.iItemIndex == aRight.iItemIndex ) )
+ {
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::CSSYProperty()
+// ----------------------------------------------------------------------------------
+//
+CSSYProperty::CSSYProperty( const TInt /*aSensorNumber*/,
+ const TSSyChannelProperties* aProperties,
+ const TInt aNumberOfProperties )
+ {
+ SSY_TRACE_IN();
+
+ for ( TInt index = 0; index < aNumberOfProperties ; index++ )
+ {
+ iChannelProperties.Append( aProperties[ index ] );
+ }
+
+ SSY_TRACE_OUT();
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::~CSSYProperty()
+// ----------------------------------------------------------------------------------
+//
+CSSYProperty::~CSSYProperty()
+ {
+ SSY_TRACE_IN();
+
+ iRegisteredChannels.Reset();
+ iChannelProperties.Reset();
+ iChannelProperties.Close();
+ iRegisteredChannels.Close();
+
+ SSY_TRACE_OUT();
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::RegisterChannel()
+// ----------------------------------------------------------------------------------
+//
+TInt CSSYProperty::RegisterChannel( const TSensrvChannelId aChannelID )
+ {
+ SSY_TRACE_IN();
+ SSY_TRACE( EExtended, "ORIENTATIONSSY:Register channelId %d", aChannelID );
+
+ for ( TInt index = 0; index < iRegisteredChannels.Count(); index++ )
+ {
+ if ( iRegisteredChannels[index] == aChannelID )
+ {
+ return KErrAlreadyExists;
+ }
+ }
+
+ iRegisteredChannels.Append( aChannelID );
+
+ SSY_TRACE_OUT();
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::FindPropertyIndex()
+// ----------------------------------------------------------------------------------
+//
+TInt CSSYProperty::FindPropertyIndex( const TSensrvProperty& aProperty )
+ {
+ SSY_TRACE_IN();
+
+ // find the property
+ TIdentityRelation<TSSyChannelProperties> findFunction( FindMatchingProperty );
+ TSSyChannelProperties property;
+ property.iPropertyId = aProperty.GetPropertyId();
+ property.iItemIndex = aProperty.PropertyItemIndex();
+ property.iPropertyType = aProperty.PropertyType();
+
+ SSY_TRACE( EExtended, "ORIENTATIONSSY:Find property: id:%d index:%d type:%d", property.iPropertyId, property.iItemIndex, property.iPropertyType );
+
+ TInt index = iChannelProperties.Find( property, findFunction );
+
+ SSY_TRACE_OUT();
+ return index;
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::GetProperty()
+// ----------------------------------------------------------------------------------
+//
+TInt CSSYProperty::GetProperty( TSensrvProperty& aProperty )
+ {
+ SSY_TRACE_IN();
+
+ TInt returnValue( KErrNone );
+ TInt index = FindPropertyIndex( aProperty );
+
+ if ( index == KErrNotFound )
+ {
+ SSY_TRACE( EExtended, "ORIENTATIONSSY:Property not found" );
+ returnValue = KErrNotFound;
+ }
+ else if( iChannelProperties.Count() >= index )
+ {
+ switch ( iChannelProperties[ index ].iPropertyType )
+ {
+ case ESensrvIntProperty:
+ {
+ TSensrvProperty property
+ (
+ iChannelProperties[ index ].iPropertyId,
+ iChannelProperties[ index ].iItemIndex,
+ iChannelProperties[ index ].iIntValue,
+ iChannelProperties[ index ].iIntMaxValue,
+ iChannelProperties[ index ].iIntMinValue,
+ iChannelProperties[ index ].iReadOnly,
+ iChannelProperties[ index ].iPropertyType
+ );
+ aProperty = property;
+ break;
+ }
+ case ESensrvRealProperty:
+ {
+ TSensrvProperty property
+ (
+ iChannelProperties[ index ].iPropertyId,
+ iChannelProperties[ index ].iItemIndex,
+ iChannelProperties[ index ].iRealValue,
+ iChannelProperties[ index ].iRealMaxValue,
+ iChannelProperties[ index ].iRealMinValue,
+ iChannelProperties[ index ].iReadOnly,
+ iChannelProperties[ index ].iPropertyType
+ );
+ aProperty = property;
+ break;
+ }
+ case ESensrvBufferProperty:
+ {
+ TSensrvProperty property
+ (
+ iChannelProperties[ index ].iPropertyId,
+ iChannelProperties[ index ].iItemIndex,
+ iChannelProperties[ index ].iBufValue,
+ iChannelProperties[ index ].iReadOnly,
+ iChannelProperties[ index ].iPropertyType
+ );
+ aProperty = property;
+ break;
+ }
+ default:
+ {
+ SSY_TRACE( EError, "ORIENTATIONSSY:ERROR: Invalid propertype type!" );
+ ASSERT_DEBUG_SSY( 0 );
+ returnValue = KErrGeneral;
+ break;
+ }
+ }
+ }
+
+ SSY_TRACE_OUT();
+ return returnValue;
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::GetAllProperties()
+// ----------------------------------------------------------------------------------
+//
+TInt CSSYProperty::GetAllProperties( RSensrvPropertyList& aChannelPropertyList )
+ {
+ SSY_TRACE_IN();
+ TInt returnValue( KErrNone );
+ aChannelPropertyList.Reset();
+
+ for ( TInt index = 0; index < iChannelProperties.Count(); index++ )
+ {
+ switch ( iChannelProperties[ index ].iPropertyType )
+ {
+ case ESensrvIntProperty:
+ {
+ TSensrvProperty property
+ (
+ iChannelProperties[ index ].iPropertyId,
+ iChannelProperties[ index ].iItemIndex,
+ iChannelProperties[ index ].iIntValue,
+ iChannelProperties[ index ].iIntMaxValue,
+ iChannelProperties[ index ].iIntMinValue,
+ iChannelProperties[ index ].iReadOnly,
+ iChannelProperties[ index ].iPropertyType
+ );
+ aChannelPropertyList.Append( property );
+ break;
+ }
+ case ESensrvRealProperty:
+ {
+ TSensrvProperty property
+ (
+ iChannelProperties[ index ].iPropertyId,
+ iChannelProperties[ index ].iItemIndex,
+ iChannelProperties[ index ].iRealValue,
+ iChannelProperties[ index ].iRealMaxValue,
+ iChannelProperties[ index ].iRealMinValue,
+ iChannelProperties[ index ].iReadOnly,
+ iChannelProperties[ index ].iPropertyType
+ );
+ aChannelPropertyList.Append( property );
+ break;
+ }
+ case ESensrvBufferProperty:
+ {
+ TSensrvProperty property
+ (
+ iChannelProperties[ index ].iPropertyId,
+ iChannelProperties[ index ].iItemIndex,
+ iChannelProperties[ index ].iBufValue,
+ iChannelProperties[ index ].iReadOnly,
+ iChannelProperties[ index ].iPropertyType
+ );
+ aChannelPropertyList.Append( property );
+ break;
+ }
+ default:
+ {
+ SSY_TRACE( EError, "ORIENTATIONSSY:ERROR: Invalid property type!" );
+ ASSERT_DEBUG_SSY( 0 );
+ returnValue = KErrGeneral;
+ break;
+ }
+ }
+ }
+
+ SSY_TRACE_OUT();
+ return returnValue;
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::SetProperty()
+// ----------------------------------------------------------------------------------
+//
+TInt CSSYProperty::SetProperty(
+ const TSensrvProperty& aProperty,
+ RSensrvChannelList& aAffectedChannels )
+ {
+ SSY_TRACE_IN();
+
+ TInt intValue( 0 );
+ TReal realValue( 0 );
+ TInt returnValue( KErrNone );
+ TInt index = FindPropertyIndex( aProperty );
+ aAffectedChannels.Reset();
+
+ if ( index == KErrNotFound )
+ {
+ SSY_TRACE( EError, "ORIENTATIONSSY:ERROR: Property not found: 0x%x", aProperty.GetPropertyId() );
+ returnValue = KErrNotFound;
+ }
+ else if ( iChannelProperties[ index ].iReadOnly )
+ {
+ SSY_TRACE( EError, "ORIENTATIONSSY:ERROR: Trying to set a readonly property: 0x%x", aProperty.GetPropertyId() );
+ returnValue = KErrGeneral;
+ }
+
+ else if ( aProperty.GetPropertyId() == KSensrvPropIdDataRate )
+ {
+ SSY_TRACE( EExtended, "ORIENTATIONSSY: Updating data rate property" );
+ // Data rate property is replaced in a different way than others.
+ // Note that this can be done only once as this property is set to read only.
+ aProperty.GetValue( intValue );
+ // Leave value to 0, update only max value because that is the only value we can provide
+ if( iChannelProperties.Count() >= index )
+ {
+ iChannelProperties[index].iIntMaxValue = intValue;
+ iChannelProperties[index].iReadOnly = ETrue;
+ }
+
+ // No need to get data rate anymore as it's already got
+ iDataRateUpdate = ETrue;
+ }
+ else if( iChannelProperties.Count() >= index )
+ {
+ switch ( iChannelProperties[index].iPropertyType )
+ {
+ case ESensrvIntProperty:
+ {
+ aProperty.GetValue( intValue );
+
+ if ( iChannelProperties[ index ].iIntValue == intValue )
+ {
+ SSY_TRACE( EError, "ORIENTATIONSSY:ERROR: Trying to set a property to a same value that it already has: 0x%x", aProperty.GetPropertyId() );
+ returnValue = KErrAlreadyExists;
+ }
+ else
+ {
+ iChannelProperties[ index ].iIntValue = intValue;
+ }
+ break;
+ }
+ case ESensrvRealProperty:
+ {
+ aProperty.GetValue( realValue );
+ iChannelProperties[ index ].iRealValue = realValue;
+ break;
+ }
+ case ESensrvBufferProperty:
+ default:
+ {
+ SSY_TRACE( EError, "ORIENTATIONSSY:ERROR: Trying to set a buffer property value, this is not supported at the moment: 0x%x", aProperty.GetPropertyId() );
+ // no buffer value can be set at the moment, and other values are not supported
+ returnValue = KErrArgument;
+ break;
+ }
+ }
+
+ if ( KErrNone == returnValue )
+ {
+ for ( TInt index = 0; index < iRegisteredChannels.Count(); index++ )
+ {
+ aAffectedChannels.Append( iRegisteredChannels[index] );
+ }
+ }
+ }
+
+ SSY_TRACE_OUT();
+ return returnValue;
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::GetAffectedChannels()
+// ----------------------------------------------------------------------------------
+//
+void CSSYProperty::GetAffectedChannels( RSensrvChannelList& aAffectedChannels )
+ {
+ SSY_TRACE_IN();
+
+ aAffectedChannels.Reset();
+
+ for ( TInt index = 0; index < iRegisteredChannels.Count(); index++ )
+ {
+ aAffectedChannels.Append( iRegisteredChannels[index] );
+ }
+
+ SSY_TRACE_OUT();
+ }
+
+// ----------------------------------------------------------------------------------
+// CSSYProperty::DataRateUpdated()
+// ----------------------------------------------------------------------------------
+//
+TBool CSSYProperty::DataRateUpdated()
+ {
+ return iDataRateUpdate;
+ }
+
+// End of File