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/shared_impl/resource.h" 6 7#include "base/logging.h" 8#include "ppapi/shared_impl/resource_tracker.h" 9#include "ppapi/shared_impl/ppapi_globals.h" 10 11namespace ppapi { 12 13Resource::Resource(ResourceObjectType type, PP_Instance instance) 14 : host_resource_(HostResource::MakeInstanceOnly(instance)) { 15 // The instance should be valid (nonzero). 16 DCHECK(instance); 17 18 pp_resource_ = PpapiGlobals::Get()->GetResourceTracker()->AddResource(this); 19 if (type == OBJECT_IS_IMPL) { 20 // For the in-process case, the host resource and resource are the same. 21 // 22 // Note that we need to have set the instance above (in the initializer 23 // list) since AddResource needs our instance() getter to work, and that 24 // goes through the host resource. When we get the "real" resource ID, 25 // we re-set the host_resource. 26 host_resource_.SetHostResource(instance, pp_resource_); 27 } 28} 29 30Resource::Resource(ResourceObjectType type, const HostResource& host_resource) 31 : host_resource_(host_resource) { 32 pp_resource_ = PpapiGlobals::Get()->GetResourceTracker()->AddResource(this); 33 if (type == OBJECT_IS_IMPL) { 34 // When using this constructor for the implementation, the resource ID 35 // should not have been passed in. 36 DCHECK(host_resource_.host_resource() == 0); 37 38 // See previous constructor. 39 host_resource_.SetHostResource(host_resource.instance(), pp_resource_); 40 } 41} 42 43Resource::Resource(Untracked) { 44 pp_resource_ = PpapiGlobals::Get()->GetResourceTracker()->AddResource(this); 45} 46 47Resource::~Resource() { RemoveFromResourceTracker(); } 48 49PP_Resource Resource::GetReference() { 50 PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(pp_resource()); 51 return pp_resource(); 52} 53 54void Resource::NotifyLastPluginRefWasDeleted() { 55 // Notify subclasses. 56 LastPluginRefWasDeleted(); 57} 58 59void Resource::NotifyInstanceWasDeleted() { 60 // Hold a reference, because InstanceWasDeleted() may cause us to be 61 // destroyed. 62 scoped_refptr<Resource> keep_alive(this); 63 64 // Notify subclasses. 65 InstanceWasDeleted(); 66 67 host_resource_ = HostResource(); 68} 69 70void Resource::OnReplyReceived(const proxy::ResourceMessageReplyParams& params, 71 const IPC::Message& msg) { 72 NOTREACHED(); 73} 74 75void Resource::Log(PP_LogLevel level, const std::string& message) { 76 PpapiGlobals::Get()->LogWithSource( 77 pp_instance(), level, std::string(), message); 78} 79 80void Resource::RemoveFromResourceTracker() { 81 PpapiGlobals::Get()->GetResourceTracker()->RemoveResource(this); 82} 83 84#define DEFINE_TYPE_GETTER(RESOURCE) \ 85 thunk::RESOURCE* Resource::As##RESOURCE() { return NULL; } 86FOR_ALL_PPAPI_RESOURCE_APIS(DEFINE_TYPE_GETTER) 87#undef DEFINE_TYPE_GETTER 88 89} // namespace ppapi 90