15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppp_instance_private_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppp_instance_private.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/host_dispatcher.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource_tracker.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetInstanceObject(PP_Instance instance) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Dispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dispatcher->permissions().HasPermission(PERMISSION_PRIVATE))
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_MakeUndefined();
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceiveSerializedVarReturnValue result;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(new PpapiMsg_PPPInstancePrivate_GetInstanceObject(
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      API_ID_PPP_INSTANCE_PRIVATE, instance, &result));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result.Return(dispatcher);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const PPP_Instance_Private instance_private_interface = {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetInstanceObject
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Private_Proxy::PPP_Instance_Private_Proxy(Dispatcher* dispatcher)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : InterfaceProxy(dispatcher),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppp_instance_private_impl_(NULL) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dispatcher->IsPlugin()) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppp_instance_private_impl_ = static_cast<const PPP_Instance_Private*>(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dispatcher->local_get_interface()(PPP_INSTANCE_PRIVATE_INTERFACE));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_Instance_Private_Proxy::~PPP_Instance_Private_Proxy() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const PPP_Instance_Private* PPP_Instance_Private_Proxy::GetProxyInterface() {
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return &instance_private_interface;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPP_Instance_Private_Proxy::OnMessageReceived(const IPC::Message& msg) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dispatcher()->IsPlugin())
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(PPP_Instance_Private_Proxy, msg)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPInstancePrivate_GetInstanceObject,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgGetInstanceObject)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_Instance_Private_Proxy::OnMsgGetInstanceObject(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SerializedVarReturnValue result) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.Return(dispatcher(),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                CallWhileUnlocked(ppp_instance_private_impl_->GetInstanceObject,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  instance));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
79