mtp_device_object_enumerator.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2013 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// MTPDeviceObjectEnumerator implementation.
6
7#include "chrome/browser/media_galleries/win/mtp_device_object_enumerator.h"
8
9#include "base/threading/thread_restrictions.h"
10#include "content/public/browser/browser_thread.h"
11
12namespace chrome {
13
14MTPDeviceObjectEnumerator::MTPDeviceObjectEnumerator(
15    const MTPDeviceObjectEntries& entries)
16    : object_entries_(entries),
17      index_(0U),
18      is_index_ready_(false) {
19  base::ThreadRestrictions::AssertIOAllowed();
20}
21
22MTPDeviceObjectEnumerator::~MTPDeviceObjectEnumerator() {
23  DCHECK(thread_checker_.CalledOnValidThread());
24}
25
26base::FilePath MTPDeviceObjectEnumerator::Next() {
27  DCHECK(thread_checker_.CalledOnValidThread());
28  if (IsIndexReadyAndInRange())
29    ++index_;  // Normal traversal.
30  else if (!is_index_ready_)
31    is_index_ready_ = true;  // First time calling Next().
32
33  if (!HasMoreEntries())
34    return base::FilePath();
35  return base::FilePath(object_entries_[index_].name);
36}
37
38int64 MTPDeviceObjectEnumerator::Size() {
39  DCHECK(thread_checker_.CalledOnValidThread());
40  if (!IsIndexReadyAndInRange())
41    return 0;
42  return object_entries_[index_].size;
43}
44
45bool MTPDeviceObjectEnumerator::IsDirectory() {
46  DCHECK(thread_checker_.CalledOnValidThread());
47  if (!IsIndexReadyAndInRange())
48    return false;
49  return object_entries_[index_].is_directory;
50}
51
52base::Time MTPDeviceObjectEnumerator::LastModifiedTime() {
53  DCHECK(thread_checker_.CalledOnValidThread());
54  if (!IsIndexReadyAndInRange())
55    return base::Time();
56  return object_entries_[index_].last_modified_time;
57}
58
59string16 MTPDeviceObjectEnumerator::GetObjectId() const {
60  DCHECK(thread_checker_.CalledOnValidThread());
61  if (!IsIndexReadyAndInRange())
62    return string16();
63  return object_entries_[index_].object_id;
64}
65
66bool MTPDeviceObjectEnumerator::HasMoreEntries() const {
67  return index_ < object_entries_.size();
68}
69
70bool MTPDeviceObjectEnumerator::IsIndexReadyAndInRange() const {
71  return is_index_ready_ && HasMoreEntries();
72}
73
74}  // namespace chrome
75