datasourcemodules/defaultpositioningmodule/src/epos_posgenericinfouser.cpp
changeset 36 b47902b73a93
parent 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/defaultpositioningmodule/src/epos_posgenericinfouser.cpp	Fri Jun 04 10:34:15 2010 +0100
@@ -0,0 +1,285 @@
+// 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 FILES
+#include <e32cmn.h>
+#include "epos_posgenericinfouser.h"
+
+// Defines data type
+enum TFieldDataType
+    {
+    EFieldTypeTInt8,
+    EFieldTypeTInt16,
+    EFieldTypeTInt32,
+    EFieldTypeTInt64,
+    EFieldTypeTUint8,
+    EFieldTypeTUint16,
+    EFieldTypeTUint32,
+    EFieldTypeTReal32,
+    EFieldTypeTReal64,
+    EFieldTypeTTime,
+    EFieldTypeTTimeIntervalMicroSeconds,
+    EFieldTypeDes8,
+    EFieldTypeDes16
+    };
+
+// Defines struct of fields and data type
+struct TFieldIdAndType
+    {
+    TInt  iFieldId;   //Id
+    TInt  iFieldType; //Field type
+    TBool iIsList;    //Field is a list
+    };
+
+// Defines all the fields that requestd by SUPL PSY
+const struct TFieldIdAndType KGenericInfoFields[]=
+    {
+        {EPositionFieldComment,                 EFieldTypeDes16,   EFalse},
+        //Speed
+        {EPositionFieldHorizontalSpeed,         EFieldTypeTReal32, EFalse},
+        {EPositionFieldHorizontalSpeedError,    EFieldTypeTReal32, EFalse},
+        {EPositionFieldVerticalSpeed,           EFieldTypeTReal32, EFalse},
+        {EPositionFieldVerticalSpeedError,      EFieldTypeTReal32, EFalse},
+        //Direction
+        {EPositionFieldTrueCourse,              EFieldTypeTReal32, EFalse},
+        {EPositionFieldTrueCourseError,         EFieldTypeTReal32, EFalse},
+        {EPositionFieldMagneticCourse,          EFieldTypeTReal32, EFalse},
+        {EPositionFieldMagneticCourseError,     EFieldTypeTReal32, EFalse},
+        //Compass
+        {EPositionFieldHeading,                 EFieldTypeTReal32, EFalse},
+        {EPositionFieldHeadingError,            EFieldTypeTReal32, EFalse},
+        {EPositionFieldMagneticHeading,         EFieldTypeTReal32, EFalse},
+        {EPositionFieldMagneticHeadingError,    EFieldTypeTReal32, EFalse},
+        //Address
+        {EPositionFieldCountry,                 EFieldTypeDes16,   EFalse},
+        {EPositionFieldCountryCode,             EFieldTypeDes16,   EFalse},
+        {EPositionFieldState,                   EFieldTypeDes16,   EFalse},
+        {EPositionFieldCity,                    EFieldTypeDes16,   EFalse},
+        {EPositionFieldDistrict,                EFieldTypeDes16,   EFalse},
+        {EPositionFieldStreet,                  EFieldTypeDes16,   EFalse},
+        {EPositionFieldStreetExtension,         EFieldTypeDes16,   EFalse},
+        {EPositionFieldLocationName,            EFieldTypeDes16,   EFalse},
+        {EPositionFieldPostalCode,              EFieldTypeDes16,   EFalse},
+        {EPositionFieldLocality,                EFieldTypeDes16,   EFalse},
+        {EPositionFieldCrossing1,               EFieldTypeDes16,   EFalse},
+        {EPositionFieldCrossing2,               EFieldTypeDes16,   EFalse},
+        {EPositionFieldCounty,                  EFieldTypeDes16,   EFalse},
+        //Media
+        {EPositionFieldMediaLinks,              EFieldTypeTUint8,  ETrue },
+        {EPositionFieldMediaLinksStart,         EFieldTypeDes8,    EFalse},
+        //Building
+        {EPositionFieldBuildingName,            EFieldTypeDes16,   EFalse},
+        {EPositionFieldBuildingFloor,           EFieldTypeDes16,   EFalse},
+        {EPositionFieldBuildingRoom,            EFieldTypeDes16,   EFalse},
+        {EPositionFieldBuildingZone,            EFieldTypeDes16,   EFalse},
+        {EPositionFieldBuildingTelephone,       EFieldTypeDes16,   EFalse},
+        //NMEA
+        {EPositionFieldNMEASentences,           EFieldTypeTUint8,  ETrue },
+        {EPositionFieldNMEASentencesStart,      EFieldTypeDes8,    EFalse},
+        //Satellite
+        {EPositionFieldSatelliteNumInView,      EFieldTypeTInt8,   EFalse},
+        {EPositionFieldSatelliteNumUsed,        EFieldTypeTInt8,   EFalse},
+        {EPositionFieldSatelliteTime,           EFieldTypeTTime,   EFalse},
+        {EPositionFieldSatelliteHorizontalDoP,  EFieldTypeTReal32, EFalse},
+        {EPositionFieldSatelliteVerticalDoP,    EFieldTypeTReal32, EFalse},
+        {EPositionFieldSatelliteTimeDoP,        EFieldTypeTReal32, EFalse},
+        {EPositionFieldSatellitePositionDoP,    EFieldTypeTReal32, EFalse},
+        {EPositionFieldSatelliteSeaLevelAltitude,   EFieldTypeTReal32, EFalse},
+        {EPositionFieldSatelliteGeoidalSeparation,  EFieldTypeTReal32, EFalse}
+        //Custome fields are not supported
+    };
+
+
+// =========================== == OCAL FUNCTIONS ===============================
+
+
+// ========================== == EMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// PosGenericInfoUser::CopyHGenericInfo
+// -----------------------------------------------------------------------------
+//
+TInt PosGenericInfoUser::CopyHGenericInfo( 
+            const HPositionGenericInfo& aSrc,
+            HPositionGenericInfo& aDes )
+    {
+    //TRACESTRING( "PosGenericInfoUser::CopyHGenericInfo start" )
+    //TRACEHEX2( reinterpret_cast < const TUint8* >( &aSrc ), aSrc.PositionClassSize() )
+    //Set position
+    TPosition position;
+    aSrc.GetPosition( position );
+    aDes.SetPosition( position );
+        
+    TInt err( KErrNone );
+    TInt fieldId = aDes.FirstRequestedFieldId();
+    while ( fieldId != EPositionFieldNone )
+        {
+        //TRACESTRING2( "FieldId=%d", fieldId )
+
+        if ( aSrc.IsFieldAvailable( fieldId ) )
+            {
+            err = CopyField( aSrc, aDes, fieldId );
+            if ( err != KErrNone )
+                {
+                return err;
+                }
+            }
+        fieldId = aDes.NextRequestedFieldId( fieldId );
+        }
+    //TRACESTRING( "PosGenericInfoUser::CopyHGenericInfo end" )
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// PosGenericInfoUser::CopyField
+// -----------------------------------------------------------------------------
+//
+TInt PosGenericInfoUser::CopyField( 
+            const HPositionGenericInfo& aSrc,
+            HPositionGenericInfo& aDes,
+            TInt aFieldId )
+    {
+    //Get field data type
+    TInt dataType;
+    TBool isList;
+    TInt err( KErrNone );
+    err = FieldDataType( aFieldId, dataType, isList );
+    if ( err != KErrNone )
+        {
+        return err;
+        }
+        
+    if ( isList )
+        {
+        //copy list
+        TUint8 count; //length of the list
+        err = aSrc.GetValue( aFieldId, count );
+        if ( err != KErrNone )
+            {
+            return err;
+            }
+        for ( TInt i = 0; i < count; i++ )
+            {
+            err = CopyDataByType( aSrc, aDes, aFieldId + 1 + i, dataType );
+            if ( err != KErrNone )
+                {
+                return err;
+                }
+            }
+            
+        err = aDes.SetValue( aFieldId, count );
+        }
+    else
+        {
+        err = CopyDataByType( aSrc, aDes, aFieldId, dataType );
+        }
+        
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// PosGenericInfoUser::FiledDataType
+// -----------------------------------------------------------------------------
+//
+TInt PosGenericInfoUser::FieldDataType( 
+        TInt aFieldId,
+        TInt& aFieldDataType, 
+        TBool& aIsList )
+    {
+    TInt count = sizeof( KGenericInfoFields ) / sizeof( TFieldIdAndType );
+    for ( TInt i = 0; i < count; i++ )
+        {
+        if ( KGenericInfoFields[ i ].iFieldId == aFieldId )
+            {
+            aIsList = KGenericInfoFields[i].iIsList;
+            if( !aIsList )
+                {
+                aFieldDataType = KGenericInfoFields[i].iFieldType;
+                }
+            else
+                {
+                // coverity [overrun-local]
+                // iIsList of last element in statically defined array must always be False, therefore this cannot cause an overrun.
+                aFieldDataType = KGenericInfoFields[i+1].iFieldType;
+                }
+            return KErrNone;
+            }
+        }
+    return KErrNotFound;
+    }
+
+// -----------------------------------------------------------------------------
+// PosGenericInfoUser::CopyDataByType
+// -----------------------------------------------------------------------------
+//
+TInt PosGenericInfoUser::CopyDataByType( 
+            const HPositionGenericInfo& aSrc,
+            HPositionGenericInfo& aDes,
+            TInt aFieldId,
+            TInt aDataType )
+    {
+    TInt err( KErrNone );
+    switch ( aDataType )
+        {
+        case EFieldTypeTReal32:
+            err = CopyData < TReal32 >( aSrc, aDes, aFieldId );
+            break;
+        case EFieldTypeTUint8:
+            err = CopyData < TUint8 >( aSrc, aDes, aFieldId );
+            break;
+        case EFieldTypeTInt8:
+            err = CopyData < TInt8 >( aSrc, aDes, aFieldId );
+            break;
+        case EFieldTypeTTime:
+            err = CopyData < TTime >( aSrc, aDes, aFieldId );
+            break;
+        case EFieldTypeDes16:
+            err = CopyData < TPtrC16 > (aSrc, aDes, aFieldId );
+            break;
+        case EFieldTypeDes8:
+            err = CopyData < TPtrC8 > (aSrc, aDes, aFieldId );
+            break;
+        default:
+            err = KErrNotSupported;
+            break;
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// PosGenericInfoUser::CopyData
+// -----------------------------------------------------------------------------
+//
+template < class T > TInt PosGenericInfoUser::CopyData( 
+            const HPositionGenericInfo& aSrc,
+            HPositionGenericInfo& aDes,
+            TInt aFieldId )
+    {
+    T data;
+    TInt err( KErrNone );
+    err = aSrc.GetValue( aFieldId, data );
+    if ( err != KErrNone )
+        {
+        return err;
+        }
+    return aDes.SetValue( aFieldId, data );
+    }
+
+
+//  End of File