12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// MTPDeviceObjectEnumerator implementation.
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/win/mtp_device_object_enumerator.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_restrictions.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MTPDeviceObjectEnumerator::MTPDeviceObjectEnumerator(
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const MTPDeviceObjectEntries& entries)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : object_entries_(entries),
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      index_(0U),
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_index_ready_(false) {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadRestrictions::AssertIOAllowed();
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MTPDeviceObjectEnumerator::~MTPDeviceObjectEnumerator() {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath MTPDeviceObjectEnumerator::Next() {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsIndexReadyAndInRange())
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++index_;  // Normal traversal.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (!is_index_ready_)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    is_index_ready_ = true;  // First time calling Next().
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!HasMoreEntries())
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return base::FilePath();
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath(object_entries_[index_].name);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 MTPDeviceObjectEnumerator::Size() {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsIndexReadyAndInRange())
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return object_entries_[index_].size;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MTPDeviceObjectEnumerator::IsDirectory() {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsIndexReadyAndInRange())
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return object_entries_[index_].is_directory;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Time MTPDeviceObjectEnumerator::LastModifiedTime() {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsIndexReadyAndInRange())
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return base::Time();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return object_entries_[index_].last_modified_time;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MTPDeviceObjectEnumerator::GetObjectId() const {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsIndexReadyAndInRange())
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return object_entries_[index_].object_id;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MTPDeviceObjectEnumerator::HasMoreEntries() const {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return index_ < object_entries_.size();
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MTPDeviceObjectEnumerator::IsIndexReadyAndInRange() const {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return is_index_ready_ && HasMoreEntries();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
71