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