Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Side by Side Diff: content/browser/device_orientation/data_fetcher_impl_win.cc

Issue 13433002: Implement DeviceOrientation API on Windows (Closed) Base URL: ssh://nhu@powerbuilder.sh.intel.com/home/www-data/git-repos/perc/chromium.git@sensor
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/device_orientation/data_fetcher_impl_win.h"
6
7 #include <InitGuid.h>
8 #include <PortableDeviceTypes.h>
9 #include <Sensors.h>
10
11 #include "base/logging.h"
12 #include "content/browser/device_orientation/orientation.h"
13
14 using base::win::ScopedComPtr;
15
16 namespace {
17
18 // This should match ProviderImpl::kDesiredSamplingIntervalMs.
19 const int kPeriodInMilliseconds = 100;
20
21 } // namespace
22
23 namespace content {
24
25 class DataFetcherImplWin::SensorEventSink : public ISensorEvents {
26 public:
27 SensorEventSink(DataFetcherImplWin* fetcher)
bulach 2013/04/02 15:48:07 nit: use "explicit".
nhu 2013/04/03 03:06:52 Done.
28 : fetcher_(fetcher),
29 ref_count_(0) {}
30
31 virtual ~SensorEventSink() {}
32
33 // IUnknown interface
34 STDMETHODIMP_(ULONG) AddRef() {
35 return InterlockedIncrement(&ref_count_);
36 }
bulach 2013/04/02 15:48:07 nit: add a \n here, 44 and 67 (i.e., a \n in betwe
nhu 2013/04/03 03:06:52 Done.
37 STDMETHODIMP_(ULONG) Release() {
38 ULONG count = InterlockedDecrement(&ref_count_);
39 if (count == 0) {
40 delete this;
41 return 0;
42 }
43 return count;
44 }
45 STDMETHODIMP QueryInterface(REFIID iid, void** ppv)
46 {
bulach 2013/04/02 15:48:07 nit: move { up to the end of 45.. also, please ma
nhu 2013/04/03 03:06:52 Done.
47 if (ppv == NULL)
48 return E_POINTER;
49 if (iid == __uuidof(IUnknown)) {
50 *ppv = static_cast<IUnknown*>(this);
51 } else if (iid == __uuidof(ISensorEvents)) {
52 *ppv = static_cast<ISensorEvents*>(this);
53 } else {
54 *ppv = NULL;
55 return E_NOINTERFACE;
56 }
57 AddRef();
58 return S_OK;
59 }
60
61 // ISensorEvents interface
62 STDMETHODIMP OnEvent(ISensor *pSensor,
bulach 2013/04/02 15:48:07 nit: * goes in the param type. also, as above, nam
nhu 2013/04/03 03:06:52 Done.
63 REFGUID eventID,
64 IPortableDeviceValues *pEventData) {
65 return S_OK;
66 }
67 STDMETHODIMP OnDataUpdated(ISensor *pSensor, ISensorDataReport *pNewData) {
bulach 2013/04/02 15:48:07 nit: ISensor* sensor, ISensorDataReport* new_data
nhu 2013/04/03 03:06:52 Done.
68 if (NULL == pNewData || NULL == pSensor)
69 return E_INVALIDARG;
70 PROPVARIANT pv = {};
71 bool can_provide_alpha, can_provide_beta, can_provide_gamma;
72 can_provide_alpha = can_provide_beta = can_provide_gamma = false;
bulach 2013/04/02 15:48:07 nit: we normally do one per line, and then you can
nhu 2013/04/03 03:06:52 Done.
73 double alpha, beta, gamma;
74 if (SUCCEEDED(pNewData->GetSensorValue(
75 SENSOR_DATA_TYPE_TILT_X_DEGREES, &pv))) {
76 beta = pv.fltVal;
77 can_provide_beta = true;
78 }
79 PropVariantClear(&pv);
80 if (SUCCEEDED(pNewData->GetSensorValue(
81 SENSOR_DATA_TYPE_TILT_Y_DEGREES, &pv))) {
82 gamma = pv.fltVal;
83 can_provide_gamma = true;
84 }
85 PropVariantClear(&pv);
86 if (SUCCEEDED(pNewData->GetSensorValue(
87 SENSOR_DATA_TYPE_TILT_Z_DEGREES, &pv))) {
88 alpha = pv.fltVal;
89 can_provide_alpha = true;
90 }
91 PropVariantClear(&pv);
92 if (fetcher_) {
bulach 2013/04/02 15:48:07 nit: no need to test for fetcher_.. you could pote
nhu 2013/04/03 03:06:52 Done.
93 fetcher_->OnOrientationData(can_provide_alpha, alpha,
94 can_provide_beta, beta,
95 can_provide_gamma, gamma);
96 }
97
98 return S_OK;
99 }
100 STDMETHODIMP OnLeave(REFSENSOR_ID sensorID) {
101 return S_OK;
102 }
103 STDMETHODIMP OnStateChanged(ISensor* pSensor, SensorState state) {
104 return S_OK;
105 }
106
107 private:
108 long ref_count_ ;
109 DataFetcherImplWin* fetcher_;
110 };
111
112 // Create a DataFetcherImplWin object and return NULL if no valid sensor found.
113 DataFetcher* DataFetcherImplWin::Create() {
114 scoped_ptr<DataFetcherImplWin> fetcher(new DataFetcherImplWin);
115 return fetcher->Init() ? fetcher.release() : NULL;
116 }
117
118 DataFetcherImplWin::~DataFetcherImplWin() {
119 if (sensor_.get())
120 sensor_->SetEventSink(NULL);
121 }
122
123 DataFetcherImplWin::DataFetcherImplWin() {
124 }
125
126 void DataFetcherImplWin::OnOrientationData(bool can_provide_alpha,
127 double alpha,
128 bool can_provide_beta,
129 double beta,
130 bool can_provide_gamma,
131 double gamma) {
132 base::AutoLock autolock(last_orientation_lock_);
133 Orientation* orientation = new Orientation();
134 if (can_provide_alpha)
135 orientation->set_alpha(alpha);
136 if (can_provide_beta)
137 orientation->set_beta(beta);
138 if (can_provide_gamma)
139 orientation->set_gamma(gamma);
140 last_orientation_ = orientation;
141 }
142
143 const DeviceData* DataFetcherImplWin::GetDeviceData(DeviceData::Type type) {
144 if (type != DeviceData::kTypeOrientation)
145 return NULL;
146 return GetOrientation();
147 }
148
149 const Orientation* DataFetcherImplWin::GetOrientation() {
150 base::AutoLock autolock(last_orientation_lock_);
151 scoped_refptr<Orientation> orientation(new Orientation());
152 if (last_orientation_.get()) {
153 if (last_orientation_->can_provide_alpha())
154 orientation->set_alpha(last_orientation_->alpha());
155 if (last_orientation_->can_provide_beta())
156 orientation->set_beta(last_orientation_->beta());
157 if (last_orientation_->can_provide_gamma())
158 orientation->set_gamma(last_orientation_->gamma());
159 orientation->set_absolute(true);
160 }
161 orientation->AddRef();
bulach 2013/04/02 15:48:07 can we use the same mechanism as android and hold
nhu 2013/04/03 03:06:52 Thanks for your suggestion. Actually, I used to tr
162 return orientation.get();
163 }
164
165 bool DataFetcherImplWin::Init() {
166 ScopedComPtr<ISensorManager> sensor_manager;
167 if (FAILED(::CoCreateInstance(CLSID_SensorManager,
168 NULL,
169 CLSCTX_INPROC_SERVER,
170 __uuidof(ISensorManager),
171 sensor_manager.ReceiveVoid())))
172 return false;
173
174 ScopedComPtr<ISensorCollection> sensor_collection;
175 if (FAILED(sensor_manager->GetSensorsByType(
176 SENSOR_TYPE_INCLINOMETER_3D, sensor_collection.Receive())))
bulach 2013/04/02 15:48:07 nit: continuation should be indented by 4 spaces
nhu 2013/04/03 03:06:52 Done.
177 return false;
178
179 if (FAILED(sensor_collection->GetAt(0, sensor_.Receive())))
180 return false;
181
182 ScopedComPtr<IPortableDeviceValues> device_values;
183 if (SUCCEEDED(CoCreateInstance(CLSID_PortableDeviceValues,
184 NULL,
185 CLSCTX_INPROC_SERVER,
186 __uuidof(IPortableDeviceValues),
187 device_values.ReceiveVoid()))) {
188 if (SUCCEEDED(device_values->SetUnsignedIntegerValue(
189 SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL,
bulach 2013/04/02 15:48:07 nit: indent by 4
nhu 2013/04/03 03:06:52 Done.
190 kPeriodInMilliseconds))) {
191 ScopedComPtr<IPortableDeviceValues> return_values;
192 sensor_->SetProperties(device_values.get(), return_values.Receive());
193 }
194 }
195
196 SensorEventSink* sensor_event_class = new SensorEventSink(this);
197 ScopedComPtr<ISensorEvents> sensor_events;
198 if (FAILED(sensor_event_class->QueryInterface(
199 __uuidof(ISensorEvents), sensor_events.ReceiveVoid())))
bulach 2013/04/02 15:48:07 should sensor_event_class be deleted here and 202?
nhu 2013/04/03 03:06:52 As my understanding and verification, the SensorEv
200 return false;
201 if (FAILED(sensor_->SetEventSink(sensor_events.get())))
202 return false;
203
204 return sensor_.get() != NULL;
205 }
206
207 } // namespace content
208
bulach 2013/04/02 15:48:07 nit: remove extra \n
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698