Home | History | Annotate | Download | only in proxy
      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/proxy/ppp_instance_private_proxy.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "ppapi/c/pp_var.h"
     10 #include "ppapi/c/private/ppp_instance_private.h"
     11 #include "ppapi/proxy/host_dispatcher.h"
     12 #include "ppapi/proxy/plugin_dispatcher.h"
     13 #include "ppapi/proxy/plugin_resource_tracker.h"
     14 #include "ppapi/proxy/ppapi_messages.h"
     15 #include "ppapi/shared_impl/proxy_lock.h"
     16 
     17 namespace ppapi {
     18 namespace proxy {
     19 
     20 namespace {
     21 
     22 PP_Var GetInstanceObject(PP_Instance instance) {
     23   Dispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
     24   if (!dispatcher->permissions().HasPermission(PERMISSION_PRIVATE))
     25     return PP_MakeUndefined();
     26 
     27   ReceiveSerializedVarReturnValue result;
     28   dispatcher->Send(new PpapiMsg_PPPInstancePrivate_GetInstanceObject(
     29       API_ID_PPP_INSTANCE_PRIVATE, instance, &result));
     30   return result.Return(dispatcher);
     31 }
     32 
     33 static const PPP_Instance_Private instance_private_interface = {
     34   &GetInstanceObject
     35 };
     36 
     37 InterfaceProxy* CreateInstancePrivateProxy(Dispatcher* dispatcher) {
     38   return new PPP_Instance_Private_Proxy(dispatcher);
     39 }
     40 
     41 }  // namespace
     42 
     43 PPP_Instance_Private_Proxy::PPP_Instance_Private_Proxy(Dispatcher* dispatcher)
     44     : InterfaceProxy(dispatcher),
     45       ppp_instance_private_impl_(NULL) {
     46   if (dispatcher->IsPlugin()) {
     47     ppp_instance_private_impl_ = static_cast<const PPP_Instance_Private*>(
     48         dispatcher->local_get_interface()(PPP_INSTANCE_PRIVATE_INTERFACE));
     49   }
     50 }
     51 
     52 PPP_Instance_Private_Proxy::~PPP_Instance_Private_Proxy() {
     53 }
     54 
     55 // static
     56 const InterfaceProxy::Info* PPP_Instance_Private_Proxy::GetInfo() {
     57   static const Info info = {
     58     &instance_private_interface,
     59     PPP_INSTANCE_PRIVATE_INTERFACE,
     60     API_ID_PPP_INSTANCE_PRIVATE,
     61     false,
     62     &CreateInstancePrivateProxy,
     63   };
     64   return &info;
     65 }
     66 
     67 bool PPP_Instance_Private_Proxy::OnMessageReceived(const IPC::Message& msg) {
     68   if (!dispatcher()->IsPlugin())
     69     return false;
     70 
     71   bool handled = true;
     72   IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Private_Proxy, msg)
     73     IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstancePrivate_GetInstanceObject,
     74                         OnMsgGetInstanceObject)
     75     IPC_MESSAGE_UNHANDLED(handled = false)
     76   IPC_END_MESSAGE_MAP()
     77   return handled;
     78 }
     79 
     80 void PPP_Instance_Private_Proxy::OnMsgGetInstanceObject(
     81     PP_Instance instance,
     82     SerializedVarReturnValue result) {
     83   result.Return(dispatcher(),
     84                 CallWhileUnlocked(ppp_instance_private_impl_->GetInstanceObject,
     85                                   instance));
     86 }
     87 
     88 }  // namespace proxy
     89 }  // namespace ppapi
     90