10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/device_sensors/device_motion_message_filter.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/device_sensors/device_inertial_sensor_service.h"
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/device_sensors/device_motion_messages.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace content {
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochDeviceMotionMessageFilter::DeviceMotionMessageFilter()
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(DeviceMotionMsgStart),
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_started_(false) {
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochDeviceMotionMessageFilter::~DeviceMotionMessageFilter() {
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (is_started_)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DeviceInertialSensorService::GetInstance()->RemoveConsumer(
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        CONSUMER_TYPE_MOTION);
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool DeviceMotionMessageFilter::OnMessageReceived(const IPC::Message& message) {
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool handled = true;
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(DeviceMotionMessageFilter, message)
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(DeviceMotionHostMsg_StartPolling,
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnDeviceMotionStartPolling)
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_HANDLER(DeviceMotionHostMsg_StopPolling,
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnDeviceMotionStopPolling)
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    IPC_MESSAGE_UNHANDLED(handled = false)
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return handled;
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid DeviceMotionMessageFilter::OnDeviceMotionStartPolling() {
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(!is_started_);
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (is_started_)
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  is_started_ = true;
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DeviceInertialSensorService::GetInstance()->AddConsumer(
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CONSUMER_TYPE_MOTION);
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DidStartDeviceMotionPolling();
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid DeviceMotionMessageFilter::OnDeviceMotionStopPolling() {
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK(is_started_);
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!is_started_)
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  is_started_ = false;
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DeviceInertialSensorService::GetInstance()->RemoveConsumer(
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CONSUMER_TYPE_MOTION);
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid DeviceMotionMessageFilter::DidStartDeviceMotionPolling() {
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Send(new DeviceMotionMsg_DidStartPolling(
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      DeviceInertialSensorService::GetInstance()->
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          GetSharedMemoryHandleForProcess(
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              CONSUMER_TYPE_MOTION, PeerHandle())));
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace content
63