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