1// Copyright (c) 2010 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/cpp/directory_entry.h"
6
7#include <string.h>
8
9#include "ppapi/cpp/logging.h"
10#include "ppapi/cpp/module.h"
11
12namespace pp {
13
14DirectoryEntry::DirectoryEntry() {
15  memset(&data_, 0, sizeof(data_));
16}
17
18DirectoryEntry::DirectoryEntry(
19    PassRef, const PP_DirectoryEntry& data) {
20  data_.file_ref = data.file_ref;
21  data_.file_type = data.file_type;
22}
23
24DirectoryEntry::DirectoryEntry(const DirectoryEntry& other) {
25  data_.file_ref = other.data_.file_ref;
26  data_.file_type = other.data_.file_type;
27  if (data_.file_ref)
28    Module::Get()->core()->AddRefResource(data_.file_ref);
29}
30
31DirectoryEntry::~DirectoryEntry() {
32  if (data_.file_ref)
33    Module::Get()->core()->ReleaseResource(data_.file_ref);
34}
35
36DirectoryEntry& DirectoryEntry::operator=(
37    const DirectoryEntry& other) {
38  if (data_.file_ref)
39    Module::Get()->core()->ReleaseResource(data_.file_ref);
40  data_ = other.data_;
41  if (data_.file_ref)
42    Module::Get()->core()->AddRefResource(data_.file_ref);
43  return *this;
44}
45
46namespace internal {
47
48DirectoryEntryArrayOutputAdapterWithStorage::
49    DirectoryEntryArrayOutputAdapterWithStorage() {
50  set_output(&temp_storage_);
51}
52
53DirectoryEntryArrayOutputAdapterWithStorage::
54    ~DirectoryEntryArrayOutputAdapterWithStorage() {
55  if (!temp_storage_.empty()) {
56    // An easy way to release the resource references held by |temp_storage_|.
57    // A destructor for PP_DirectoryEntry will release them.
58    output();
59  }
60}
61
62std::vector<DirectoryEntry>&
63    DirectoryEntryArrayOutputAdapterWithStorage::output() {
64  PP_DCHECK(output_storage_.empty());
65  typedef std::vector<PP_DirectoryEntry> Entries;
66  for (Entries::iterator it = temp_storage_.begin();
67       it != temp_storage_.end();
68       ++it) {
69    output_storage_.push_back(DirectoryEntry(PASS_REF, *it));
70  }
71  temp_storage_.clear();
72  return output_storage_;
73}
74
75}  // namespace internal
76}  // namespace pp
77