1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/basictypes.h"
6#include "ppapi/c/dev/ppb_text_input_dev.h"
7#include "ppapi/c/ppb_text_input_controller.h"
8#include "ppapi/shared_impl/var.h"
9#include "ppapi/thunk/enter.h"
10#include "ppapi/thunk/ppb_instance_api.h"
11#include "ppapi/thunk/thunk.h"
12
13namespace ppapi {
14namespace thunk {
15
16namespace {
17
18COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_NONE) == int(PP_TEXTINPUT_TYPE_NONE),
19               mismatching_enums);
20COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_TEXT) == int(PP_TEXTINPUT_TYPE_TEXT),
21               mismatching_enums);
22COMPILE_ASSERT(
23    int(PP_TEXTINPUT_TYPE_DEV_PASSWORD) == int(PP_TEXTINPUT_TYPE_PASSWORD),
24    mismatching_enums);
25COMPILE_ASSERT(
26    int(PP_TEXTINPUT_TYPE_DEV_SEARCH) == int(PP_TEXTINPUT_TYPE_SEARCH),
27    mismatching_enums);
28COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_EMAIL) == int(PP_TEXTINPUT_TYPE_EMAIL),
29               mismatching_enums);
30COMPILE_ASSERT(
31    int(PP_TEXTINPUT_TYPE_DEV_NUMBER) == int(PP_TEXTINPUT_TYPE_NUMBER),
32    mismatching_enums);
33COMPILE_ASSERT(
34    int(PP_TEXTINPUT_TYPE_DEV_TELEPHONE) == int(PP_TEXTINPUT_TYPE_TELEPHONE),
35    mismatching_enums);
36COMPILE_ASSERT(int(PP_TEXTINPUT_TYPE_DEV_URL) == int(PP_TEXTINPUT_TYPE_URL),
37               mismatching_enums);
38
39void SetTextInputType(PP_Instance instance, PP_TextInput_Type type) {
40  EnterInstance enter(instance);
41  if (enter.succeeded())
42    enter.functions()->SetTextInputType(instance, type);
43}
44
45void SetTextInputType_0_2(PP_Instance instance, PP_TextInput_Type_Dev type) {
46  EnterInstance enter(instance);
47  if (enter.succeeded())
48    enter.functions()->SetTextInputType(instance,
49                                        static_cast<PP_TextInput_Type>(type));
50}
51
52void UpdateCaretPosition_0_2(PP_Instance instance,
53                         const PP_Rect* caret,
54                         const PP_Rect* bounding_box) {
55  EnterInstance enter(instance);
56  if (enter.succeeded() && caret && bounding_box)
57    enter.functions()->UpdateCaretPosition(instance, *caret, *bounding_box);
58}
59
60void UpdateCaretPosition(PP_Instance instance,
61                         const PP_Rect* caret) {
62  EnterInstance enter(instance);
63  if (enter.succeeded() && caret)
64    enter.functions()->UpdateCaretPosition(instance, *caret, PP_Rect());
65}
66
67void CancelCompositionText(PP_Instance instance) {
68  EnterInstance enter(instance);
69  if (enter.succeeded())
70    enter.functions()->CancelCompositionText(instance);
71}
72
73void UpdateSurroundingText_0_2(PP_Instance instance, const char* text,
74                               uint32_t caret, uint32_t anchor) {
75  EnterInstance enter(instance);
76  if (enter.succeeded())
77    enter.functions()->UpdateSurroundingText(instance, text, caret, anchor);
78}
79
80void UpdateSurroundingText_1_0(PP_Instance instance, PP_Var text,
81                               uint32_t caret, uint32_t anchor) {
82  EnterInstance enter(instance);
83  StringVar* var = StringVar::FromPPVar(text);
84  if (enter.succeeded() && var)
85    enter.functions()->UpdateSurroundingText(instance,
86                                             var->value().c_str(),
87                                             caret,
88                                             anchor);
89}
90
91void SelectionChanged(PP_Instance instance) {
92  EnterInstance enter(instance);
93  if (enter.succeeded())
94    enter.functions()->SelectionChanged(instance);
95}
96
97const PPB_TextInput_Dev_0_1 g_ppb_textinput_0_1_thunk = {
98  &SetTextInputType_0_2,
99  &UpdateCaretPosition_0_2,
100  &CancelCompositionText,
101};
102
103const PPB_TextInput_Dev_0_2 g_ppb_textinput_0_2_thunk = {
104  &SetTextInputType_0_2,
105  &UpdateCaretPosition_0_2,
106  &CancelCompositionText,
107  &UpdateSurroundingText_0_2,
108  &SelectionChanged,
109};
110
111const PPB_TextInputController_1_0 g_ppb_textinputcontroller_1_0_thunk = {
112  &SetTextInputType,
113  &UpdateCaretPosition,
114  &CancelCompositionText,
115  &UpdateSurroundingText_1_0,
116};
117
118}  // namespace
119
120const PPB_TextInput_Dev_0_1* GetPPB_TextInput_Dev_0_1_Thunk() {
121  return &g_ppb_textinput_0_1_thunk;
122}
123
124const PPB_TextInput_Dev_0_2* GetPPB_TextInput_Dev_0_2_Thunk() {
125  return &g_ppb_textinput_0_2_thunk;
126}
127
128const PPB_TextInputController_1_0* GetPPB_TextInputController_1_0_Thunk() {
129  return &g_ppb_textinputcontroller_1_0_thunk;
130}
131
132}  // namespace thunk
133}  // namespace ppapi
134