datasourcemodules/defaultpositioningmodule/src/epos_posgenericinfouser.cpp
changeset 0 9cfd9a3ee49c
equal deleted inserted replaced
-1:000000000000 0:9cfd9a3ee49c
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32cmn.h>
       
    21 #include "epos_posgenericinfouser.h"
       
    22 
       
    23 // Defines data type
       
    24 enum TFieldDataType
       
    25     {
       
    26     EFieldTypeTInt8,
       
    27     EFieldTypeTInt16,
       
    28     EFieldTypeTInt32,
       
    29     EFieldTypeTInt64,
       
    30     EFieldTypeTUint8,
       
    31     EFieldTypeTUint16,
       
    32     EFieldTypeTUint32,
       
    33     EFieldTypeTReal32,
       
    34     EFieldTypeTReal64,
       
    35     EFieldTypeTTime,
       
    36     EFieldTypeTTimeIntervalMicroSeconds,
       
    37     EFieldTypeDes8,
       
    38     EFieldTypeDes16
       
    39     };
       
    40 
       
    41 // Defines struct of fields and data type
       
    42 struct TFieldIdAndType
       
    43     {
       
    44     TInt  iFieldId;   //Id
       
    45     TInt  iFieldType; //Field type
       
    46     TBool iIsList;    //Field is a list
       
    47     };
       
    48 
       
    49 // Defines all the fields that requestd by SUPL PSY
       
    50 const struct TFieldIdAndType KGenericInfoFields[]=
       
    51     {
       
    52         {EPositionFieldComment,                 EFieldTypeDes16,   EFalse},
       
    53         //Speed
       
    54         {EPositionFieldHorizontalSpeed,         EFieldTypeTReal32, EFalse},
       
    55         {EPositionFieldHorizontalSpeedError,    EFieldTypeTReal32, EFalse},
       
    56         {EPositionFieldVerticalSpeed,           EFieldTypeTReal32, EFalse},
       
    57         {EPositionFieldVerticalSpeedError,      EFieldTypeTReal32, EFalse},
       
    58         //Direction
       
    59         {EPositionFieldTrueCourse,              EFieldTypeTReal32, EFalse},
       
    60         {EPositionFieldTrueCourseError,         EFieldTypeTReal32, EFalse},
       
    61         {EPositionFieldMagneticCourse,          EFieldTypeTReal32, EFalse},
       
    62         {EPositionFieldMagneticCourseError,     EFieldTypeTReal32, EFalse},
       
    63         //Compass
       
    64         {EPositionFieldHeading,                 EFieldTypeTReal32, EFalse},
       
    65         {EPositionFieldHeadingError,            EFieldTypeTReal32, EFalse},
       
    66         {EPositionFieldMagneticHeading,         EFieldTypeTReal32, EFalse},
       
    67         {EPositionFieldMagneticHeadingError,    EFieldTypeTReal32, EFalse},
       
    68         //Address
       
    69         {EPositionFieldCountry,                 EFieldTypeDes16,   EFalse},
       
    70         {EPositionFieldCountryCode,             EFieldTypeDes16,   EFalse},
       
    71         {EPositionFieldState,                   EFieldTypeDes16,   EFalse},
       
    72         {EPositionFieldCity,                    EFieldTypeDes16,   EFalse},
       
    73         {EPositionFieldDistrict,                EFieldTypeDes16,   EFalse},
       
    74         {EPositionFieldStreet,                  EFieldTypeDes16,   EFalse},
       
    75         {EPositionFieldStreetExtension,         EFieldTypeDes16,   EFalse},
       
    76         {EPositionFieldLocationName,            EFieldTypeDes16,   EFalse},
       
    77         {EPositionFieldPostalCode,              EFieldTypeDes16,   EFalse},
       
    78         {EPositionFieldLocality,                EFieldTypeDes16,   EFalse},
       
    79         {EPositionFieldCrossing1,               EFieldTypeDes16,   EFalse},
       
    80         {EPositionFieldCrossing2,               EFieldTypeDes16,   EFalse},
       
    81         {EPositionFieldCounty,                  EFieldTypeDes16,   EFalse},
       
    82         //Media
       
    83         {EPositionFieldMediaLinks,              EFieldTypeTUint8,  ETrue },
       
    84         {EPositionFieldMediaLinksStart,         EFieldTypeDes8,    EFalse},
       
    85         //Building
       
    86         {EPositionFieldBuildingName,            EFieldTypeDes16,   EFalse},
       
    87         {EPositionFieldBuildingFloor,           EFieldTypeDes16,   EFalse},
       
    88         {EPositionFieldBuildingRoom,            EFieldTypeDes16,   EFalse},
       
    89         {EPositionFieldBuildingZone,            EFieldTypeDes16,   EFalse},
       
    90         {EPositionFieldBuildingTelephone,       EFieldTypeDes16,   EFalse},
       
    91         //NMEA
       
    92         {EPositionFieldNMEASentences,           EFieldTypeTUint8,  ETrue },
       
    93         {EPositionFieldNMEASentencesStart,      EFieldTypeDes8,    EFalse},
       
    94         //Satellite
       
    95         {EPositionFieldSatelliteNumInView,      EFieldTypeTInt8,   EFalse},
       
    96         {EPositionFieldSatelliteNumUsed,        EFieldTypeTInt8,   EFalse},
       
    97         {EPositionFieldSatelliteTime,           EFieldTypeTTime,   EFalse},
       
    98         {EPositionFieldSatelliteHorizontalDoP,  EFieldTypeTReal32, EFalse},
       
    99         {EPositionFieldSatelliteVerticalDoP,    EFieldTypeTReal32, EFalse},
       
   100         {EPositionFieldSatelliteTimeDoP,        EFieldTypeTReal32, EFalse},
       
   101         {EPositionFieldSatellitePositionDoP,    EFieldTypeTReal32, EFalse},
       
   102         {EPositionFieldSatelliteSeaLevelAltitude,   EFieldTypeTReal32, EFalse},
       
   103         {EPositionFieldSatelliteGeoidalSeparation,  EFieldTypeTReal32, EFalse}
       
   104         //Custome fields are not supported
       
   105     };
       
   106 
       
   107 
       
   108 // =========================== == OCAL FUNCTIONS ===============================
       
   109 
       
   110 
       
   111 // ========================== == EMBER FUNCTIONS ===============================
       
   112 
       
   113 
       
   114 // -----------------------------------------------------------------------------
       
   115 // PosGenericInfoUser::CopyHGenericInfo
       
   116 // -----------------------------------------------------------------------------
       
   117 //
       
   118 TInt PosGenericInfoUser::CopyHGenericInfo( 
       
   119             const HPositionGenericInfo& aSrc,
       
   120             HPositionGenericInfo& aDes )
       
   121     {
       
   122     //TRACESTRING( "PosGenericInfoUser::CopyHGenericInfo start" )
       
   123     //TRACEHEX2( reinterpret_cast < const TUint8* >( &aSrc ), aSrc.PositionClassSize() )
       
   124     //Set position
       
   125     TPosition position;
       
   126     aSrc.GetPosition( position );
       
   127     aDes.SetPosition( position );
       
   128         
       
   129     TInt err( KErrNone );
       
   130     TInt fieldId = aDes.FirstRequestedFieldId();
       
   131     while ( fieldId != EPositionFieldNone )
       
   132         {
       
   133         //TRACESTRING2( "FieldId=%d", fieldId )
       
   134 
       
   135         if ( aSrc.IsFieldAvailable( fieldId ) )
       
   136             {
       
   137             err = CopyField( aSrc, aDes, fieldId );
       
   138             if ( err != KErrNone )
       
   139                 {
       
   140                 return err;
       
   141                 }
       
   142             }
       
   143         fieldId = aDes.NextRequestedFieldId( fieldId );
       
   144         }
       
   145     //TRACESTRING( "PosGenericInfoUser::CopyHGenericInfo end" )
       
   146     return err;
       
   147     }
       
   148 
       
   149 // -----------------------------------------------------------------------------
       
   150 // PosGenericInfoUser::CopyField
       
   151 // -----------------------------------------------------------------------------
       
   152 //
       
   153 TInt PosGenericInfoUser::CopyField( 
       
   154             const HPositionGenericInfo& aSrc,
       
   155             HPositionGenericInfo& aDes,
       
   156             TInt aFieldId )
       
   157     {
       
   158     //Get field data type
       
   159     TInt dataType;
       
   160     TBool isList;
       
   161     TInt err( KErrNone );
       
   162     err = FieldDataType( aFieldId, dataType, isList );
       
   163     if ( err != KErrNone )
       
   164         {
       
   165         return err;
       
   166         }
       
   167         
       
   168     if ( isList )
       
   169         {
       
   170         //copy list
       
   171         TUint8 count; //length of the list
       
   172         err = aSrc.GetValue( aFieldId, count );
       
   173         if ( err != KErrNone )
       
   174             {
       
   175             return err;
       
   176             }
       
   177         for ( TInt i = 0; i < count; i++ )
       
   178             {
       
   179             err = CopyDataByType( aSrc, aDes, aFieldId + 1 + i, dataType );
       
   180             if ( err != KErrNone )
       
   181                 {
       
   182                 return err;
       
   183                 }
       
   184             }
       
   185             
       
   186         err = aDes.SetValue( aFieldId, count );
       
   187         }
       
   188     else
       
   189         {
       
   190         err = CopyDataByType( aSrc, aDes, aFieldId, dataType );
       
   191         }
       
   192         
       
   193     return err;
       
   194     }
       
   195 
       
   196 // -----------------------------------------------------------------------------
       
   197 // PosGenericInfoUser::FiledDataType
       
   198 // -----------------------------------------------------------------------------
       
   199 //
       
   200 TInt PosGenericInfoUser::FieldDataType( 
       
   201         TInt aFieldId,
       
   202         TInt& aFieldDataType, 
       
   203         TBool& aIsList )
       
   204     {
       
   205     TInt count = sizeof( KGenericInfoFields ) / sizeof( TFieldIdAndType );
       
   206     for ( TInt i = 0; i < count; i++ )
       
   207         {
       
   208         if ( KGenericInfoFields[ i ].iFieldId == aFieldId )
       
   209             {
       
   210             aIsList = KGenericInfoFields[i].iIsList;
       
   211             if( !aIsList )
       
   212                 {
       
   213                 aFieldDataType = KGenericInfoFields[i].iFieldType;
       
   214                 }
       
   215             else
       
   216                 {
       
   217                 // coverity [overrun-local]
       
   218                 // iIsList of last element in statically defined array must always be False, therefore this cannot cause an overrun.
       
   219                 aFieldDataType = KGenericInfoFields[i+1].iFieldType;
       
   220                 }
       
   221             return KErrNone;
       
   222             }
       
   223         }
       
   224     return KErrNotFound;
       
   225     }
       
   226 
       
   227 // -----------------------------------------------------------------------------
       
   228 // PosGenericInfoUser::CopyDataByType
       
   229 // -----------------------------------------------------------------------------
       
   230 //
       
   231 TInt PosGenericInfoUser::CopyDataByType( 
       
   232             const HPositionGenericInfo& aSrc,
       
   233             HPositionGenericInfo& aDes,
       
   234             TInt aFieldId,
       
   235             TInt aDataType )
       
   236     {
       
   237     TInt err( KErrNone );
       
   238     switch ( aDataType )
       
   239         {
       
   240         case EFieldTypeTReal32:
       
   241             err = CopyData < TReal32 >( aSrc, aDes, aFieldId );
       
   242             break;
       
   243         case EFieldTypeTUint8:
       
   244             err = CopyData < TUint8 >( aSrc, aDes, aFieldId );
       
   245             break;
       
   246         case EFieldTypeTInt8:
       
   247             err = CopyData < TInt8 >( aSrc, aDes, aFieldId );
       
   248             break;
       
   249         case EFieldTypeTTime:
       
   250             err = CopyData < TTime >( aSrc, aDes, aFieldId );
       
   251             break;
       
   252         case EFieldTypeDes16:
       
   253             err = CopyData < TPtrC16 > (aSrc, aDes, aFieldId );
       
   254             break;
       
   255         case EFieldTypeDes8:
       
   256             err = CopyData < TPtrC8 > (aSrc, aDes, aFieldId );
       
   257             break;
       
   258         default:
       
   259             err = KErrNotSupported;
       
   260             break;
       
   261         }
       
   262     return err;
       
   263     }
       
   264 
       
   265 // -----------------------------------------------------------------------------
       
   266 // PosGenericInfoUser::CopyData
       
   267 // -----------------------------------------------------------------------------
       
   268 //
       
   269 template < class T > TInt PosGenericInfoUser::CopyData( 
       
   270             const HPositionGenericInfo& aSrc,
       
   271             HPositionGenericInfo& aDes,
       
   272             TInt aFieldId )
       
   273     {
       
   274     T data;
       
   275     TInt err( KErrNone );
       
   276     err = aSrc.GetValue( aFieldId, data );
       
   277     if ( err != KErrNone )
       
   278         {
       
   279         return err;
       
   280         }
       
   281     return aDes.SetValue( aFieldId, data );
       
   282     }
       
   283 
       
   284 
       
   285 //  End of File