| // 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_READ_DIR_PROGRESS_H_ |
| #define SMBPROVIDER_READ_DIR_PROGRESS_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include "smbprovider/iterator/caching_iterator.h" |
| #include "smbprovider/proto.h" |
| #include "smbprovider/samba_interface.h" |
| |
| namespace smbprovider { |
| class DirectoryEntryListProto; |
| class MetadataCache; |
| |
| // Keeps track of the progress of a ReadDirectory operation. |
| // |
| // A ReadDirectory is started by constructing a ReadDirProgress and calling |
| // StartReadDir(). The ReadDirectory is continued by calling ContinueReadDir(). |
| class ReadDirProgress { |
| public: |
| explicit ReadDirProgress(SambaInterface* samba_interface); |
| |
| // Allows setting |batch_size_| to a small number for testing. |
| ReadDirProgress(SambaInterface* samba_interface, uint32_t initial_batch_size); |
| |
| ~ReadDirProgress(); |
| |
| // Starts a ReadDirectory using |iterator|. The first batch of directory |
| // entries are returned via |out_entries|. Returns true if ContinueReadDir |
| // must be called again. Returns false if the ReadDirectory is complete or has |
| // failed. |error| is 0 if the ReadDirectory completed successfully, and errno |
| // otherwise. |
| bool StartReadDir(const std::string& directory_path, |
| MetadataCache* cache, |
| int32_t* error, |
| DirectoryEntryListProto* out_entries); |
| |
| // Continues the ReadDirectory. The next batch of directory entries are |
| // returned via |out_entries|. Returns true if ContinueReadDir must be called |
| // again. Returns false if the ReadDirectory is complete or has failed. |
| // |error| is 0 if the ReadDirectory completed successfully, and errno |
| // otherwise. |
| bool ContinueReadDir(int32_t* error, DirectoryEntryListProto* out_entries); |
| |
| private: |
| // Increments |batch_size_|. |
| void IncreaseBatchSize(); |
| |
| SambaInterface* samba_interface_; // Not owned. |
| uint32_t batch_size_; |
| std::unique_ptr<CachingIterator> iterator_; |
| bool is_started_ = false; |
| |
| DISALLOW_COPY_AND_ASSIGN(ReadDirProgress); |
| }; |
| |
| } // namespace smbprovider |
| |
| #endif // SMBPROVIDER_READ_DIR_PROGRESS_H_ |