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 "ppapi/cpp/dev/ime_input_event_dev.h"
6
7#include "ppapi/cpp/instance.h"
8#include "ppapi/cpp/module.h"
9#include "ppapi/cpp/module_impl.h"
10#include "ppapi/cpp/var.h"
11
12namespace pp {
13
14namespace {
15
16template <> const char* interface_name<PPB_IMEInputEvent_Dev_0_2>() {
17  return PPB_IME_INPUT_EVENT_DEV_INTERFACE_0_2;
18}
19
20template <> const char* interface_name<PPB_IMEInputEvent_Dev_0_1>() {
21  return PPB_IME_INPUT_EVENT_DEV_INTERFACE_0_1;
22}
23
24}  // namespace
25
26// IMEInputEvent_Dev -------------------------------------------------------
27
28IMEInputEvent_Dev::IMEInputEvent_Dev() : InputEvent() {
29}
30
31IMEInputEvent_Dev::IMEInputEvent_Dev(const InputEvent& event) : InputEvent() {
32  bool is_ime_event = false;
33  if (has_interface<PPB_IMEInputEvent_Dev_0_2>()) {
34    if (get_interface<PPB_IMEInputEvent_Dev_0_2>()->IsIMEInputEvent(
35        event.pp_resource())) {
36      is_ime_event = true;
37    }
38  } else if (has_interface<PPB_IMEInputEvent_Dev_0_1>()) {
39    if (get_interface<PPB_IMEInputEvent_Dev_0_1>()->IsIMEInputEvent(
40        event.pp_resource())) {
41      is_ime_event = true;
42    }
43  }
44
45  if (is_ime_event) {
46    Module::Get()->core()->AddRefResource(event.pp_resource());
47    PassRefFromConstructor(event.pp_resource());
48  }
49}
50
51IMEInputEvent_Dev::IMEInputEvent_Dev(
52    const InstanceHandle& instance,
53    PP_InputEvent_Type type,
54    PP_TimeTicks time_stamp,
55    const Var& text,
56    const std::vector<uint32_t>& segment_offsets,
57    int32_t target_segment,
58    const std::pair<uint32_t, uint32_t>& selection) : InputEvent() {
59  if (!has_interface<PPB_IMEInputEvent_Dev_0_2>())
60    return;
61  uint32_t dummy = 0;
62  PassRefFromConstructor(get_interface<PPB_IMEInputEvent_Dev_0_2>()->Create(
63      instance.pp_instance(), type, time_stamp, text.pp_var(),
64      segment_offsets.empty() ? 0 : segment_offsets.size() - 1,
65      segment_offsets.empty() ? &dummy : &segment_offsets[0],
66      target_segment, selection.first, selection.second));
67}
68
69
70Var IMEInputEvent_Dev::GetText() const {
71  if (has_interface<PPB_IMEInputEvent_Dev_0_2>()) {
72    return Var(PASS_REF,
73               get_interface<PPB_IMEInputEvent_Dev_0_2>()->GetText(
74                   pp_resource()));
75  } else if (has_interface<PPB_IMEInputEvent_Dev_0_1>()) {
76    return Var(PASS_REF,
77               get_interface<PPB_IMEInputEvent_Dev_0_1>()->GetText(
78                   pp_resource()));
79  }
80  return Var();
81}
82
83uint32_t IMEInputEvent_Dev::GetSegmentNumber() const {
84  if (has_interface<PPB_IMEInputEvent_Dev_0_2>()) {
85    return get_interface<PPB_IMEInputEvent_Dev_0_2>()->GetSegmentNumber(
86        pp_resource());
87  } else if (has_interface<PPB_IMEInputEvent_Dev_0_1>()) {
88    return get_interface<PPB_IMEInputEvent_Dev_0_1>()->GetSegmentNumber(
89        pp_resource());
90  }
91  return 0;
92}
93
94uint32_t IMEInputEvent_Dev::GetSegmentOffset(uint32_t index) const {
95  if (has_interface<PPB_IMEInputEvent_Dev_0_2>()) {
96    return get_interface<PPB_IMEInputEvent_Dev_0_2>()->GetSegmentOffset(
97        pp_resource(), index);
98  } else if (has_interface<PPB_IMEInputEvent_Dev_0_1>()) {
99    return get_interface<PPB_IMEInputEvent_Dev_0_1>()->GetSegmentOffset(
100        pp_resource(), index);
101  }
102  return 0;
103}
104
105int32_t IMEInputEvent_Dev::GetTargetSegment() const {
106  if (has_interface<PPB_IMEInputEvent_Dev_0_2>()) {
107    return get_interface<PPB_IMEInputEvent_Dev_0_2>()->GetTargetSegment(
108        pp_resource());
109  } else if (has_interface<PPB_IMEInputEvent_Dev_0_1>()) {
110    return get_interface<PPB_IMEInputEvent_Dev_0_1>()->GetTargetSegment(
111        pp_resource());
112  }
113  return 0;
114}
115
116std::pair<uint32_t, uint32_t> IMEInputEvent_Dev::GetSelection() const {
117  std::pair<uint32_t, uint32_t> range(0, 0);
118  if (has_interface<PPB_IMEInputEvent_Dev_0_2>()) {
119    get_interface<PPB_IMEInputEvent_Dev_0_2>()->GetSelection(pp_resource(),
120                                                         &range.first,
121                                                         &range.second);
122  } else if (has_interface<PPB_IMEInputEvent_Dev_0_1>()) {
123    get_interface<PPB_IMEInputEvent_Dev_0_1>()->GetSelection(pp_resource(),
124                                                             &range.first,
125                                                             &range.second);
126  }
127  return range;
128}
129
130
131}  // namespace pp
132