Home | History | Annotate | Download | only in cpp
      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 
     12 namespace pp {
     13 
     14 DirectoryEntry::DirectoryEntry() {
     15   memset(&data_, 0, sizeof(data_));
     16 }
     17 
     18 DirectoryEntry::DirectoryEntry(
     19     PassRef, const PP_DirectoryEntry& data) {
     20   data_.file_ref = data.file_ref;
     21   data_.file_type = data.file_type;
     22 }
     23 
     24 DirectoryEntry::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 
     31 DirectoryEntry::~DirectoryEntry() {
     32   if (data_.file_ref)
     33     Module::Get()->core()->ReleaseResource(data_.file_ref);
     34 }
     35 
     36 DirectoryEntry& 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 
     46 namespace internal {
     47 
     48 DirectoryEntryArrayOutputAdapterWithStorage::
     49     DirectoryEntryArrayOutputAdapterWithStorage() {
     50   set_output(&temp_storage_);
     51 }
     52 
     53 DirectoryEntryArrayOutputAdapterWithStorage::
     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 
     62 std::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