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/shared_impl/resource.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource_tracker.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Resource::Resource(ResourceObjectType type, PP_Instance instance)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : host_resource_(HostResource::MakeInstanceOnly(instance)) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The instance should be valid (nonzero).
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(instance);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_resource_ = PpapiGlobals::Get()->GetResourceTracker()->AddResource(this);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == OBJECT_IS_IMPL) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For the in-process case, the host resource and resource are the same.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note that we need to have set the instance above (in the initializer
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // list) since AddResource needs our instance() getter to work, and that
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // goes through the host resource. When we get the "real" resource ID,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we re-set the host_resource.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resource_.SetHostResource(instance, pp_resource_);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Resource::Resource(ResourceObjectType type, const HostResource& host_resource)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : host_resource_(host_resource) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_resource_ = PpapiGlobals::Get()->GetResourceTracker()->AddResource(this);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == OBJECT_IS_IMPL) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When using this constructor for the implementation, the resource ID
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // should not have been passed in.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(host_resource_.host_resource() == 0);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // See previous constructor.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resource_.SetHostResource(host_resource.instance(), pp_resource_);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Resource::Resource(Untracked) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_resource_ = PpapiGlobals::Get()->GetResourceTracker()->AddResource(this);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Resource::~Resource() {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RemoveFromResourceTracker();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource Resource::GetReference() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(pp_resource());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp_resource();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Resource::NotifyLastPluginRefWasDeleted() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify subclasses.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LastPluginRefWasDeleted();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Resource::NotifyInstanceWasDeleted() {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Hold a reference, because InstanceWasDeleted() may cause us to be
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destroyed.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Resource> keep_alive(this);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify subclasses.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstanceWasDeleted();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resource_ = HostResource();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Resource::OnReplyReceived(const proxy::ResourceMessageReplyParams& params,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const IPC::Message& msg) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Resource::Log(PP_LogLevel level, const std::string& message) {
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)printf("Log:%s\n", message.c_str());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiGlobals::Get()->LogWithSource(pp_instance(), level, std::string(),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     message);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Resource::RemoveFromResourceTracker() {
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->RemoveResource(this);
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEFINE_TYPE_GETTER(RESOURCE) \
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  thunk::RESOURCE* Resource::As##RESOURCE() { return NULL; }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FOR_ALL_PPAPI_RESOURCE_APIS(DEFINE_TYPE_GETTER)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef DEFINE_TYPE_GETTER
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94