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