| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SMBPROVIDER_ITERATOR_CACHING_ITERATOR_H_ |
| #define SMBPROVIDER_ITERATOR_CACHING_ITERATOR_H_ |
| |
| #include <string> |
| #include <utility> |
| |
| #include <base/compiler_specific.h> |
| #include <base/macros.h> |
| |
| #include "smbprovider/iterator/directory_iterator.h" |
| #include "smbprovider/metadata_cache.h" |
| |
| namespace smbprovider { |
| |
| // Iterator class that wraps a directory iterator and stores each |
| // entry in a cache as it is iterated over. |
| class CachingIterator { |
| public: |
| CachingIterator(DirectoryIterator it, MetadataCache* cache) |
| : inner_it_(std::move(it)), cache_(cache) {} |
| |
| CachingIterator(const std::string& full_path, |
| SambaInterface* samba_interface, |
| MetadataCache* cache) |
| : CachingIterator(DirectoryIterator(full_path, samba_interface), cache) {} |
| |
| CachingIterator(CachingIterator&& other) = default; |
| |
| ~CachingIterator() = default; |
| |
| // Initializes the iterator, setting the first value of current. Returns 0 on |
| // success, error on failure. Must be called before any other operation. |
| int32_t Init() WARN_UNUSED_RESULT { return inner_it_.Init(); } |
| |
| // Advances current to the next entry. Returns 0 on success, |
| // error on failure. |
| int32_t Next() WARN_UNUSED_RESULT { return inner_it_.Next(); } |
| |
| // Returns the current DirectoryEntry. |
| const DirectoryEntry& Get() { |
| const DirectoryEntry& entry = inner_it_.Get(); |
| cache_->AddEntry(entry); |
| return entry; |
| } |
| |
| // Returns true if there is nothing left to iterate over. |
| bool IsDone() WARN_UNUSED_RESULT { return inner_it_.IsDone(); } |
| |
| private: |
| DirectoryIterator inner_it_; |
| MetadataCache* cache_ = nullptr; // Not owned. |
| |
| DISALLOW_COPY_AND_ASSIGN(CachingIterator); |
| }; |
| |
| } // namespace smbprovider |
| |
| #endif // SMBPROVIDER_ITERATOR_CACHING_ITERATOR_H_ |