// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/renderer/screen_orientation/screen_orientation_dispatcher.h"

#include "content/common/screen_orientation_messages.h"

namespace content {

ScreenOrientationDispatcher::ScreenOrientationDispatcher(
    RenderFrame* render_frame)
    : RenderFrameObserver(render_frame) {
}

ScreenOrientationDispatcher::~ScreenOrientationDispatcher() {
}

bool ScreenOrientationDispatcher::OnMessageReceived(
    const IPC::Message& message) {
  bool handled = true;

  IPC_BEGIN_MESSAGE_MAP(ScreenOrientationDispatcher, message)
    IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockSuccess,
                        OnLockSuccess)
    IPC_MESSAGE_HANDLER(ScreenOrientationMsg_LockError,
                        OnLockError)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()

  return handled;
}

void ScreenOrientationDispatcher::OnLockSuccess(
    int request_id,
    unsigned angle,
    blink::WebScreenOrientationType orientation) {
  blink::WebLockOrientationCallback* callback =
      pending_callbacks_.Lookup(request_id);
  if (!callback)
    return;
  callback->onSuccess(angle, orientation);
  pending_callbacks_.Remove(request_id);
}

void ScreenOrientationDispatcher::OnLockError(
    int request_id,
    blink::WebLockOrientationCallback::ErrorType error) {
  blink::WebLockOrientationCallback* callback =
      pending_callbacks_.Lookup(request_id);
  if (!callback)
    return;
  callback->onError(error);
  pending_callbacks_.Remove(request_id);
}

void ScreenOrientationDispatcher::CancelPendingLocks() {
  for (CallbackMap::Iterator<blink::WebLockOrientationCallback>
       iterator(&pending_callbacks_); !iterator.IsAtEnd(); iterator.Advance()) {
    iterator.GetCurrentValue()->onError(
        blink::WebLockOrientationCallback::ErrorTypeCanceled);
    pending_callbacks_.Remove(iterator.GetCurrentKey());
  }
}

void ScreenOrientationDispatcher::lockOrientation(
    blink::WebScreenOrientationLockType orientation,
    blink::WebLockOrientationCallback* callback) {
  CancelPendingLocks();

  int request_id = pending_callbacks_.Add(callback);
  Send(new ScreenOrientationHostMsg_LockRequest(
      routing_id(), orientation, request_id));
}

void ScreenOrientationDispatcher::unlockOrientation() {
  CancelPendingLocks();
  Send(new ScreenOrientationHostMsg_Unlock(routing_id()));
}

}  // namespace content
