Home | History | Annotate | Download | only in cpp
      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/instance.h"
      6 
      7 #include "ppapi/c/pp_errors.h"
      8 #include "ppapi/c/ppb_console.h"
      9 #include "ppapi/c/ppb_input_event.h"
     10 #include "ppapi/c/ppb_instance.h"
     11 #include "ppapi/c/ppb_messaging.h"
     12 #include "ppapi/cpp/compositor.h"
     13 #include "ppapi/cpp/graphics_2d.h"
     14 #include "ppapi/cpp/graphics_3d.h"
     15 #include "ppapi/cpp/image_data.h"
     16 #include "ppapi/cpp/instance_handle.h"
     17 #include "ppapi/cpp/logging.h"
     18 #include "ppapi/cpp/module.h"
     19 #include "ppapi/cpp/module_impl.h"
     20 #include "ppapi/cpp/point.h"
     21 #include "ppapi/cpp/resource.h"
     22 #include "ppapi/cpp/var.h"
     23 #include "ppapi/cpp/view.h"
     24 
     25 namespace pp {
     26 
     27 namespace {
     28 
     29 template <> const char* interface_name<PPB_Console_1_0>() {
     30   return PPB_CONSOLE_INTERFACE_1_0;
     31 }
     32 
     33 template <> const char* interface_name<PPB_InputEvent_1_0>() {
     34   return PPB_INPUT_EVENT_INTERFACE_1_0;
     35 }
     36 
     37 template <> const char* interface_name<PPB_Instance_1_0>() {
     38   return PPB_INSTANCE_INTERFACE_1_0;
     39 }
     40 
     41 template <> const char* interface_name<PPB_Messaging_1_0>() {
     42   return PPB_MESSAGING_INTERFACE_1_0;
     43 }
     44 
     45 }  // namespace
     46 
     47 Instance::Instance(PP_Instance instance) : pp_instance_(instance) {
     48 }
     49 
     50 Instance::~Instance() {
     51 }
     52 
     53 bool Instance::Init(uint32_t /*argc*/, const char* /*argn*/[],
     54                     const char* /*argv*/[]) {
     55   return true;
     56 }
     57 
     58 void Instance::DidChangeView(const View& view) {
     59   // Call the deprecated version for source backwards-compat.
     60   DidChangeView(view.GetRect(), view.GetClipRect());
     61 }
     62 
     63 void Instance::DidChangeView(const pp::Rect& /*position*/,
     64                              const pp::Rect& /*clip*/) {
     65 }
     66 
     67 void Instance::DidChangeFocus(bool /*has_focus*/) {
     68 }
     69 
     70 
     71 bool Instance::HandleDocumentLoad(const URLLoader& /*url_loader*/) {
     72   return false;
     73 }
     74 
     75 bool Instance::HandleInputEvent(const InputEvent& /*event*/) {
     76   return false;
     77 }
     78 
     79 void Instance::HandleMessage(const Var& /*message*/) {
     80   return;
     81 }
     82 
     83 bool Instance::BindGraphics(const Graphics2D& graphics) {
     84   if (!has_interface<PPB_Instance_1_0>())
     85     return false;
     86   return PP_ToBool(get_interface<PPB_Instance_1_0>()->BindGraphics(
     87       pp_instance(), graphics.pp_resource()));
     88 }
     89 
     90 bool Instance::BindGraphics(const Graphics3D& graphics) {
     91   if (!has_interface<PPB_Instance_1_0>())
     92     return false;
     93   return PP_ToBool(get_interface<PPB_Instance_1_0>()->BindGraphics(
     94       pp_instance(), graphics.pp_resource()));
     95 }
     96 
     97 bool Instance::BindGraphics(const Compositor& compositor) {
     98   if (!has_interface<PPB_Instance_1_0>())
     99     return false;
    100   return PP_ToBool(get_interface<PPB_Instance_1_0>()->BindGraphics(
    101       pp_instance(), compositor.pp_resource()));
    102 }
    103 
    104 bool Instance::IsFullFrame() {
    105   if (!has_interface<PPB_Instance_1_0>())
    106     return false;
    107   return PP_ToBool(get_interface<PPB_Instance_1_0>()->IsFullFrame(
    108       pp_instance()));
    109 }
    110 
    111 int32_t Instance::RequestInputEvents(uint32_t event_classes) {
    112   if (!has_interface<PPB_InputEvent_1_0>())
    113     return PP_ERROR_NOINTERFACE;
    114   return get_interface<PPB_InputEvent_1_0>()->RequestInputEvents(pp_instance(),
    115                                                                  event_classes);
    116 }
    117 
    118 int32_t Instance::RequestFilteringInputEvents(uint32_t event_classes) {
    119   if (!has_interface<PPB_InputEvent_1_0>())
    120     return PP_ERROR_NOINTERFACE;
    121   return get_interface<PPB_InputEvent_1_0>()->RequestFilteringInputEvents(
    122       pp_instance(), event_classes);
    123 }
    124 
    125 void Instance::ClearInputEventRequest(uint32_t event_classes) {
    126   if (!has_interface<PPB_InputEvent_1_0>())
    127     return;
    128   get_interface<PPB_InputEvent_1_0>()->ClearInputEventRequest(pp_instance(),
    129                                                           event_classes);
    130 }
    131 
    132 void Instance::PostMessage(const Var& message) {
    133   if (!has_interface<PPB_Messaging_1_0>())
    134     return;
    135   get_interface<PPB_Messaging_1_0>()->PostMessage(pp_instance(),
    136                                               message.pp_var());
    137 }
    138 
    139 void Instance::LogToConsole(PP_LogLevel level, const Var& value) {
    140   if (!has_interface<PPB_Console_1_0>())
    141     return;
    142   get_interface<PPB_Console_1_0>()->Log(
    143       pp_instance(), level, value.pp_var());
    144 }
    145 
    146 void Instance::LogToConsoleWithSource(PP_LogLevel level,
    147                                       const Var& source,
    148                                       const Var& value) {
    149   if (!has_interface<PPB_Console_1_0>())
    150     return;
    151   get_interface<PPB_Console_1_0>()->LogWithSource(
    152       pp_instance(), level, source.pp_var(), value.pp_var());
    153 }
    154 
    155 void Instance::AddPerInstanceObject(const std::string& interface_name,
    156                                     void* object) {
    157   // Ensure we're not trying to register more than one object per interface
    158   // type. Otherwise, we'll get confused in GetPerInstanceObject.
    159   PP_DCHECK(interface_name_to_objects_.find(interface_name) ==
    160             interface_name_to_objects_.end());
    161   interface_name_to_objects_[interface_name] = object;
    162 }
    163 
    164 void Instance::RemovePerInstanceObject(const std::string& interface_name,
    165                                        void* object) {
    166   InterfaceNameToObjectMap::iterator found = interface_name_to_objects_.find(
    167       interface_name);
    168   if (found == interface_name_to_objects_.end()) {
    169     // Attempting to unregister an object that doesn't exist or was already
    170     // unregistered.
    171     PP_DCHECK(false);
    172     return;
    173   }
    174 
    175   // Validate that we're removing the object we thing we are.
    176   PP_DCHECK(found->second == object);
    177   (void)object;  // Prevent warning in release mode.
    178 
    179   interface_name_to_objects_.erase(found);
    180 }
    181 
    182 // static
    183 void Instance::RemovePerInstanceObject(const InstanceHandle& instance,
    184                                        const std::string& interface_name,
    185                                        void* object) {
    186   // TODO(brettw) assert we're on the main thread.
    187   Instance* that = Module::Get()->InstanceForPPInstance(instance.pp_instance());
    188   if (!that)
    189     return;
    190   that->RemovePerInstanceObject(interface_name, object);
    191 }
    192 
    193 // static
    194 void* Instance::GetPerInstanceObject(PP_Instance instance,
    195                                      const std::string& interface_name) {
    196   Instance* that = Module::Get()->InstanceForPPInstance(instance);
    197   if (!that)
    198     return NULL;
    199   InterfaceNameToObjectMap::iterator found =
    200       that->interface_name_to_objects_.find(interface_name);
    201   if (found == that->interface_name_to_objects_.end())
    202     return NULL;
    203   return found->second;
    204 }
    205 
    206 }  // namespace pp
    207