mirror of
https://github.com/nestriness/cdc-file-transfer.git
synced 2026-01-30 14:35:37 +02:00
The tools allow efficient and fast synchronization of large directory trees from a Windows workstation to a Linux target machine. cdc_rsync* support efficient copy of files by using content-defined chunking (CDC) to identify chunks within files that can be reused. asset_stream_manager + cdc_fuse_fs support efficient streaming of a local directory to a remote virtual file system based on FUSE. It also employs CDC to identify and reuse unchanged data chunks.
95 lines
3.4 KiB
C++
95 lines
3.4 KiB
C++
/*
|
|
* Copyright 2022 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef MANIFEST_MANIFEST_ITERATOR_H_
|
|
#define MANIFEST_MANIFEST_ITERATOR_H_
|
|
|
|
#include <list>
|
|
|
|
#include "data_store/data_store_reader.h"
|
|
|
|
namespace cdc_ft {
|
|
|
|
class ManifestIterator {
|
|
public:
|
|
// Constructs a new manifest iterator that can read a manifest proto from the
|
|
// given |chunk_store|.
|
|
explicit ManifestIterator(DataStoreReader* data_store);
|
|
~ManifestIterator();
|
|
|
|
// Opens the manifest identified by |manifest_id| from the chunk store. If
|
|
// this method returns an Ok() status, an AssetProto may be fetched by
|
|
// calling NextEntry(). In case of an error, the value of Status() is
|
|
// returned.
|
|
absl::Status Open(const ContentIdProto& manifest_id);
|
|
|
|
// Opens the manifest stored in the file path given as |manifest_file|.
|
|
// Further chunks will be read from the chunk store, if needed. If this method
|
|
// returns an Ok() status, an AssetProto may be fetched by calling
|
|
// NextEntry(). In case of an error, the value of Status() is returned.
|
|
absl::Status Open(const std::string& manifest_file);
|
|
|
|
// Returns any error that might have occured so far.
|
|
absl::Status Status() const { return status_; }
|
|
|
|
// Returns true as long as a manifest has been opened, no error has occured,
|
|
// and a call to NextEntry() has a chance to succeed.
|
|
bool Valid() const;
|
|
|
|
// Yields the next asset from the opened manifest. Returns nullptr in case of
|
|
// an error or if no more assets are available. Check Status() to distinguish
|
|
// between those two cases.
|
|
//
|
|
// Calling NextEntry() invalidates any references to objects returned by
|
|
// previous calls to this function.
|
|
const AssetProto* NextEntry();
|
|
|
|
// Returns the current relative path. This corresponds to the directory path
|
|
// in which the asset returned from the last call to NextEntry() is located,
|
|
// relative to the manifest root.
|
|
const std::string& RelativePath() const { return rel_path_; }
|
|
|
|
// Returns a reference to the loaded manifest proto. Only valid after a
|
|
// successful call to Open().
|
|
const ManifestProto& Manifest() const { return manifest_; }
|
|
|
|
private:
|
|
struct OpenedDirectory;
|
|
|
|
// Resets the iterator for a new Open() call.
|
|
void Reset();
|
|
|
|
// Returns the AssetProto at |index| from the given list |assets|. If the
|
|
// AssetProto is of type DIRECTORY, it is pushed on top of the stack of open
|
|
// directories. Does not check if |index| is out-of-bounds.
|
|
AssetProto* MutableAsset(RepeatedAssetProto* assets, int index);
|
|
|
|
// Updates the relative path according to the current stack of opened
|
|
// directories.
|
|
void UpdateRelPath(const OpenedDirectory* od);
|
|
|
|
ManifestProto manifest_;
|
|
std::list<OpenedDirectory> dirs_;
|
|
const OpenedDirectory* last_opened_dir_;
|
|
std::string rel_path_;
|
|
absl::Status status_;
|
|
DataStoreReader* data_store_;
|
|
};
|
|
|
|
} // namespace cdc_ft
|
|
|
|
#endif // MANIFEST_MANIFEST_ITERATOR_H_
|