// 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 "ppapi/proxy/ppp_find_proxy.h"

#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/shared_impl/api_id.h"
#include "ppapi/shared_impl/proxy_lock.h"

namespace ppapi {
namespace proxy {

namespace {

#if !defined(OS_NACL)
PP_Bool StartFind(PP_Instance instance,
                  const char* text,
                  PP_Bool case_sensitive) {
  DCHECK(case_sensitive == PP_FALSE);
  HostDispatcher::GetForInstance(instance)->Send(
      new PpapiPluginMsg_PPPFind_StartFind(API_ID_PPP_FIND_PRIVATE,
                                           instance,
                                           text));
  return PP_TRUE;
}

void SelectFindResult(PP_Instance instance,
                      PP_Bool forward) {
  HostDispatcher::GetForInstance(instance)->Send(
      new PpapiPluginMsg_PPPFind_SelectFindResult(API_ID_PPP_FIND_PRIVATE,
                                                  instance, forward));
}

void StopFind(PP_Instance instance) {
  HostDispatcher::GetForInstance(instance)->Send(
      new PpapiPluginMsg_PPPFind_StopFind(API_ID_PPP_FIND_PRIVATE, instance));
}

const PPP_Find_Private ppp_find_interface = {
  &StartFind,
  &SelectFindResult,
  &StopFind
};
#else
// The NaCl plugin doesn't need the host side interface - stub it out.
const PPP_Find_Private ppp_find_interface = {};
#endif

}  // namespace

PPP_Find_Proxy::PPP_Find_Proxy(Dispatcher* dispatcher)
    : InterfaceProxy(dispatcher),
      ppp_find_(NULL) {
  if (dispatcher->IsPlugin()) {
    ppp_find_ = static_cast<const PPP_Find_Private*>(
        dispatcher->local_get_interface()(PPP_FIND_PRIVATE_INTERFACE));
  }
}

PPP_Find_Proxy::~PPP_Find_Proxy() {
}

// static
const PPP_Find_Private* PPP_Find_Proxy::GetProxyInterface() {
  return &ppp_find_interface;
}

bool PPP_Find_Proxy::OnMessageReceived(const IPC::Message& msg) {
  if (!dispatcher()->IsPlugin())
    return false;

  bool handled = true;
  IPC_BEGIN_MESSAGE_MAP(PPP_Find_Proxy, msg)
    IPC_MESSAGE_HANDLER(PpapiPluginMsg_PPPFind_StartFind, OnPluginMsgStartFind)
    IPC_MESSAGE_HANDLER(PpapiPluginMsg_PPPFind_SelectFindResult,
                        OnPluginMsgSelectFindResult)
    IPC_MESSAGE_HANDLER(PpapiPluginMsg_PPPFind_StopFind, OnPluginMsgStopFind)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()
  return handled;
}

void PPP_Find_Proxy::OnPluginMsgStartFind(PP_Instance instance,
                                          const std::string& text) {
  if (ppp_find_)
    CallWhileUnlocked(ppp_find_->StartFind, instance, text.c_str(), PP_FALSE);
}

void PPP_Find_Proxy::OnPluginMsgSelectFindResult(PP_Instance instance,
                                                 PP_Bool forward) {
  if (ppp_find_)
    CallWhileUnlocked(ppp_find_->SelectFindResult, instance, forward);
}

void PPP_Find_Proxy::OnPluginMsgStopFind(PP_Instance instance) {
  if (ppp_find_)
    CallWhileUnlocked(ppp_find_->StopFind, instance);
}

}  // namespace proxy
}  // namespace ppapi
