sensorservices/orientationssy/src/SsyProperty.cpp
changeset 0 4e1aa6a622a0
child 21 ccb4f6b3db21
--- /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