1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "GonkSensorsHelpers.h"
8
9 namespace mozilla {
10 namespace hal {
11
12 //
13 // Unpacking
14 //
15
16 nsresult
UnpackPDU(DaemonSocketPDU & aPDU,SensorsEvent & aOut)17 UnpackPDU(DaemonSocketPDU& aPDU, SensorsEvent& aOut)
18 {
19 nsresult rv = UnpackPDU(aPDU, aOut.mType);
20 if (NS_FAILED(rv)) {
21 return rv;
22 }
23 rv = UnpackPDU(aPDU, aOut.mTimestamp);
24 if (NS_FAILED(rv)) {
25 return rv;
26 }
27 rv = UnpackPDU(aPDU, aOut.mStatus);
28 if (NS_FAILED(rv)) {
29 return rv;
30 }
31
32 size_t i = 0;
33
34 switch (aOut.mType) {
35 case SENSORS_TYPE_MAGNETIC_FIELD_UNCALIBRATED:
36 case SENSORS_TYPE_GYROSCOPE_UNCALIBRATED:
37 /* 6 data values */
38 rv = UnpackPDU(aPDU, aOut.mData.mFloat[i++]);
39 if (NS_FAILED(rv)) {
40 return rv;
41 }
42 /* fall through */
43 case SENSORS_TYPE_ROTATION_VECTOR:
44 case SENSORS_TYPE_GAME_ROTATION_VECTOR:
45 case SENSORS_TYPE_GEOMAGNETIC_ROTATION_VECTOR:
46 /* 5 data values */
47 rv = UnpackPDU(aPDU, aOut.mData.mFloat[i++]);
48 if (NS_FAILED(rv)) {
49 return rv;
50 }
51 rv = UnpackPDU(aPDU, aOut.mData.mFloat[i++]);
52 if (NS_FAILED(rv)) {
53 return rv;
54 }
55 /* fall through */
56 case SENSORS_TYPE_ACCELEROMETER:
57 case SENSORS_TYPE_GEOMAGNETIC_FIELD:
58 case SENSORS_TYPE_ORIENTATION:
59 case SENSORS_TYPE_GYROSCOPE:
60 case SENSORS_TYPE_GRAVITY:
61 case SENSORS_TYPE_LINEAR_ACCELERATION:
62 /* 3 data values */
63 rv = UnpackPDU(aPDU, aOut.mData.mFloat[i++]);
64 if (NS_FAILED(rv)) {
65 return rv;
66 }
67 rv = UnpackPDU(aPDU, aOut.mData.mFloat[i++]);
68 if (NS_FAILED(rv)) {
69 return rv;
70 }
71 /* fall through */
72 case SENSORS_TYPE_LIGHT:
73 case SENSORS_TYPE_PRESSURE:
74 case SENSORS_TYPE_TEMPERATURE:
75 case SENSORS_TYPE_PROXIMITY:
76 case SENSORS_TYPE_RELATIVE_HUMIDITY:
77 case SENSORS_TYPE_AMBIENT_TEMPERATURE:
78 case SENSORS_TYPE_HEART_RATE:
79 case SENSORS_TYPE_TILT_DETECTOR:
80 case SENSORS_TYPE_WAKE_GESTURE:
81 case SENSORS_TYPE_GLANCE_GESTURE:
82 case SENSORS_TYPE_PICK_UP_GESTURE:
83 case SENSORS_TYPE_WRIST_TILT_GESTURE:
84 case SENSORS_TYPE_SIGNIFICANT_MOTION:
85 case SENSORS_TYPE_STEP_DETECTED:
86 /* 1 data value */
87 rv = UnpackPDU(aPDU, aOut.mData.mFloat[i++]);
88 if (NS_FAILED(rv)) {
89 return rv;
90 }
91 break;
92 case SENSORS_TYPE_STEP_COUNTER:
93 /* 1 data value */
94 rv = UnpackPDU(aPDU, aOut.mData.mUint[0]);
95 if (NS_FAILED(rv)) {
96 return rv;
97 }
98 break;
99 default:
100 if (MOZ_HAL_IPC_UNPACK_WARN_IF(true, SensorsEvent)) {
101 return NS_ERROR_ILLEGAL_VALUE;
102 }
103 }
104 rv = UnpackPDU(aPDU, aOut.mDeliveryMode);
105 if (NS_FAILED(rv)) {
106 return rv;
107 }
108 return NS_OK;
109 }
110
111 } // namespace hal
112 } // namespace mozilla
113