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 11 namespace ppapi { 12 13 Resource::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 30 Resource::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 43 Resource::Resource(Untracked) { 44 pp_resource_ = PpapiGlobals::Get()->GetResourceTracker()->AddResource(this); 45 } 46 47 Resource::~Resource() { RemoveFromResourceTracker(); } 48 49 PP_Resource Resource::GetReference() { 50 PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(pp_resource()); 51 return pp_resource(); 52 } 53 54 void Resource::NotifyLastPluginRefWasDeleted() { 55 // Notify subclasses. 56 LastPluginRefWasDeleted(); 57 } 58 59 void 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 70 void Resource::OnReplyReceived(const proxy::ResourceMessageReplyParams& params, 71 const IPC::Message& msg) { 72 NOTREACHED(); 73 } 74 75 void Resource::Log(PP_LogLevel level, const std::string& message) { 76 PpapiGlobals::Get()->LogWithSource( 77 pp_instance(), level, std::string(), message); 78 } 79 80 void Resource::RemoveFromResourceTracker() { 81 PpapiGlobals::Get()->GetResourceTracker()->RemoveResource(this); 82 } 83 84 #define DEFINE_TYPE_GETTER(RESOURCE) \ 85 thunk::RESOURCE* Resource::As##RESOURCE() { return NULL; } 86 FOR_ALL_PPAPI_RESOURCE_APIS(DEFINE_TYPE_GETTER) 87 #undef DEFINE_TYPE_GETTER 88 89 } // namespace ppapi 90