datasourcemodules/defaultpositioningmodule/src/epos_posgenericinfouser.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:38:06 +0300
branchRCL_3
changeset 54 0c2046328c85
parent 0 9cfd9a3ee49c
permissions -rw-r--r--
Revision: 201027 Kit: 201035

// 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