ppb_device_ref_shared.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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/ppb_device_ref_shared.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "ppapi/shared_impl/host_resource.h"
9#include "ppapi/shared_impl/ppapi_globals.h"
10#include "ppapi/shared_impl/ppb_resource_array_shared.h"
11#include "ppapi/shared_impl/resource_tracker.h"
12#include "ppapi/shared_impl/var.h"
13
14using ppapi::thunk::PPB_DeviceRef_API;
15
16namespace ppapi {
17
18DeviceRefData::DeviceRefData()
19    : type(PP_DEVICETYPE_DEV_INVALID) {
20}
21
22PPB_DeviceRef_Shared::PPB_DeviceRef_Shared(ResourceObjectType type,
23                                           PP_Instance instance,
24                                           const DeviceRefData& data)
25    : Resource(type, instance),
26      data_(data) {
27}
28
29PPB_DeviceRef_API* PPB_DeviceRef_Shared::AsPPB_DeviceRef_API() {
30  return this;
31}
32
33const DeviceRefData& PPB_DeviceRef_Shared::GetDeviceRefData() const {
34  return data_;
35}
36
37PP_DeviceType_Dev PPB_DeviceRef_Shared::GetType() {
38  return data_.type;
39}
40
41PP_Var PPB_DeviceRef_Shared::GetName() {
42  return StringVar::StringToPPVar(data_.name);
43}
44
45// static
46PP_Resource PPB_DeviceRef_Shared::CreateResourceArray(
47    ResourceObjectType type,
48    PP_Instance instance,
49    const std::vector<DeviceRefData>& devices) {
50  scoped_ptr<PP_Resource[]> elements;
51  size_t size = devices.size();
52  if (size > 0) {
53    elements.reset(new PP_Resource[size]);
54    for (size_t index = 0; index < size; ++index) {
55      PPB_DeviceRef_Shared* device_object =
56          new PPB_DeviceRef_Shared(type, instance, devices[index]);
57      elements[index] = device_object->GetReference();
58    }
59  }
60  PPB_ResourceArray_Shared* array_object =
61      new PPB_ResourceArray_Shared(type, instance, elements.get(),
62                                   static_cast<uint32_t>(size));
63
64  for (size_t index = 0; index < size; ++index)
65    PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(elements[index]);
66
67  return array_object->GetReference();
68}
69
70}  // namespace ppapi
71