diff -r 000000000000 -r 4e1aa6a622a0 sensorservices/orientationssy/src/SsyProperty.cpp --- /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 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