Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / renderer / device_sensors / device_sensor_event_pump.cc
1 // Copyright 2014 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 "device_sensor_event_pump.h"
6
7 #include "base/logging.h"
8 #include "content/public/renderer/render_thread.h"
9
10 namespace content {
11
12 // Default interval between successive polls, should take into account the
13 // value of |kInertialSensorIntervalMillis| in
14 // content/browser/device_sensors/inertial_sensor_consts.h.
15 const int DeviceSensorEventPump::kDefaultPumpDelayMillis = 50;
16
17 int DeviceSensorEventPump::GetDelayMillis() const {
18   return pump_delay_millis_;
19 }
20
21 DeviceSensorEventPump::DeviceSensorEventPump()
22     : pump_delay_millis_(kDefaultPumpDelayMillis),
23       state_(STOPPED) {
24 }
25
26 DeviceSensorEventPump::DeviceSensorEventPump(int pump_delay_millis)
27     : pump_delay_millis_(pump_delay_millis),
28       state_(STOPPED) {
29   DCHECK_GE(pump_delay_millis_, 0);
30 }
31
32 DeviceSensorEventPump::~DeviceSensorEventPump() {
33 }
34
35 bool DeviceSensorEventPump::RequestStart() {
36   DVLOG(2) << "requested start";
37
38   if (state_ != STOPPED)
39     return false;
40
41   DCHECK(!timer_.IsRunning());
42
43   if (SendStartMessage()) {
44     state_ = PENDING_START;
45     return true;
46   }
47   return false;
48 }
49
50 bool DeviceSensorEventPump::Stop() {
51   DVLOG(2) << "stop";
52
53   if (state_ == STOPPED)
54     return true;
55
56   DCHECK((state_ == PENDING_START && !timer_.IsRunning()) ||
57       (state_ == RUNNING && timer_.IsRunning()));
58
59   if (timer_.IsRunning())
60     timer_.Stop();
61   SendStopMessage();
62   state_ = STOPPED;
63   return true;
64 }
65
66 void DeviceSensorEventPump::Attach(RenderThread* thread) {
67   if (!thread)
68     return;
69   thread->AddObserver(this);
70 }
71
72 void DeviceSensorEventPump::OnDidStart(base::SharedMemoryHandle handle) {
73   DVLOG(2) << "did start sensor event pump";
74
75   if (state_ != PENDING_START)
76     return;
77
78   DCHECK(!timer_.IsRunning());
79
80   if (InitializeReader(handle)) {
81     timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(GetDelayMillis()),
82                  this, &DeviceSensorEventPump::FireEvent);
83     state_ = RUNNING;
84   }
85 }
86
87 }  // namespace content