// Copyright (c) 2012 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_text_input_proxy.h"

#include "ppapi/c/dev/ppp_text_input_dev.h"
#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/shared_impl/proxy_lock.h"

namespace ppapi {
namespace proxy {

namespace {

#if !defined(OS_NACL)
void RequestSurroundingText(PP_Instance instance,
                            uint32_t desired_number_of_characters) {
  proxy::HostDispatcher* dispatcher =
      proxy::HostDispatcher::GetForInstance(instance);
  if (!dispatcher) {
    // The dispatcher should always be valid.
    NOTREACHED();
    return;
  }

  dispatcher->Send(new PpapiMsg_PPPTextInput_RequestSurroundingText(
      API_ID_PPP_TEXT_INPUT, instance, desired_number_of_characters));
}

const PPP_TextInput_Dev g_ppp_text_input_thunk = {
  &RequestSurroundingText
};
#else
// The NaCl plugin doesn't need the host side interface - stub it out.
static const PPP_TextInput_Dev g_ppp_text_input_thunk = {};
#endif  // !defined(OS_NACL)

}  // namespace

// static
const PPP_TextInput_Dev* PPP_TextInput_Proxy::GetProxyInterface() {
  return &g_ppp_text_input_thunk;
}

PPP_TextInput_Proxy::PPP_TextInput_Proxy(Dispatcher* dispatcher)
    : InterfaceProxy(dispatcher),
      ppp_text_input_impl_(NULL) {
  if (dispatcher->IsPlugin()) {
    ppp_text_input_impl_ = static_cast<const PPP_TextInput_Dev*>(
        dispatcher->local_get_interface()(PPP_TEXTINPUT_DEV_INTERFACE));
  }
}

PPP_TextInput_Proxy::~PPP_TextInput_Proxy() {
}

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

  bool handled = true;
  IPC_BEGIN_MESSAGE_MAP(PPP_TextInput_Proxy, msg)
    IPC_MESSAGE_HANDLER(PpapiMsg_PPPTextInput_RequestSurroundingText,
                        OnMsgRequestSurroundingText)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()
  return handled;
}

void PPP_TextInput_Proxy::OnMsgRequestSurroundingText(
    PP_Instance instance, uint32_t desired_number_of_characters) {
  if (ppp_text_input_impl_) {
    CallWhileUnlocked(ppp_text_input_impl_->RequestSurroundingText,
                      instance, desired_number_of_characters);
  }
}

}  // namespace proxy
}  // namespace ppapi
