resource.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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() { 48 RemoveFromResourceTracker(); 49} 50 51PP_Resource Resource::GetReference() { 52 PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(pp_resource()); 53 return pp_resource(); 54} 55 56void Resource::NotifyLastPluginRefWasDeleted() { 57 // Notify subclasses. 58 LastPluginRefWasDeleted(); 59} 60 61void Resource::NotifyInstanceWasDeleted() { 62 // Hold a reference, because InstanceWasDeleted() may cause us to be 63 // destroyed. 64 scoped_refptr<Resource> keep_alive(this); 65 66 // Notify subclasses. 67 InstanceWasDeleted(); 68 69 host_resource_ = HostResource(); 70} 71 72void Resource::OnReplyReceived(const proxy::ResourceMessageReplyParams& params, 73 const IPC::Message& msg) { 74 NOTREACHED(); 75} 76 77void Resource::Log(PP_LogLevel level, const std::string& message) { 78 PpapiGlobals::Get()->LogWithSource(pp_instance(), level, std::string(), 79 message); 80} 81 82void Resource::RemoveFromResourceTracker() { 83 PpapiGlobals::Get()->GetResourceTracker()->RemoveResource(this); 84} 85 86#define DEFINE_TYPE_GETTER(RESOURCE) \ 87 thunk::RESOURCE* Resource::As##RESOURCE() { return NULL; } 88FOR_ALL_PPAPI_RESOURCE_APIS(DEFINE_TYPE_GETTER) 89#undef DEFINE_TYPE_GETTER 90 91} // namespace ppapi 92 93