10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
22385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Use of this source code is governed by a BSD-style license that can be
32385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// found in the LICENSE file.
42385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/device_sensors/device_orientation_message_filter.h"
62385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/browser/device_sensors/device_inertial_sensor_service.h"
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/common/device_sensors/device_orientation_messages.h"
92385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochnamespace content {
112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochDeviceOrientationMessageFilter::DeviceOrientationMessageFilter()
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : BrowserMessageFilter(DeviceOrientationMsgStart),
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_started_(false) {
152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochDeviceOrientationMessageFilter::~DeviceOrientationMessageFilter() {
182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (is_started_)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DeviceInertialSensorService::GetInstance()->RemoveConsumer(
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        CONSUMER_TYPE_ORIENTATION);
222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool DeviceOrientationMessageFilter::OnMessageReceived(
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const IPC::Message& message) {
262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  bool handled = true;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(DeviceOrientationMessageFilter, message)
282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    IPC_MESSAGE_HANDLER(DeviceOrientationHostMsg_StartPolling,
292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                        OnDeviceOrientationStartPolling)
302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    IPC_MESSAGE_HANDLER(DeviceOrientationHostMsg_StopPolling,
312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch                        OnDeviceOrientationStopPolling)
322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    IPC_MESSAGE_UNHANDLED(handled = false)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  return handled;
352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid DeviceOrientationMessageFilter::OnDeviceOrientationStartPolling() {
382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DCHECK(!is_started_);
392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (is_started_)
402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return;
412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  is_started_ = true;
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DeviceInertialSensorService::GetInstance()->AddConsumer(
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CONSUMER_TYPE_ORIENTATION);
442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DidStartDeviceOrientationPolling();
452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid DeviceOrientationMessageFilter::OnDeviceOrientationStopPolling() {
482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  DCHECK(is_started_);
492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (!is_started_)
502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    return;
512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  is_started_ = false;
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DeviceInertialSensorService::GetInstance()->RemoveConsumer(
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CONSUMER_TYPE_ORIENTATION);
542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid DeviceOrientationMessageFilter::DidStartDeviceOrientationPolling() {
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Send(new DeviceOrientationMsg_DidStartPolling(
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      DeviceInertialSensorService::GetInstance()->
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          GetSharedMemoryHandleForProcess(
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              CONSUMER_TYPE_ORIENTATION,
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)              PeerHandle())));
622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}  // namespace content
65