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