Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1266)

Unified Diff: src/platform/update_engine/delta_diff_parser.h

Issue 465067: Missed new files in last commit
Patch Set: Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/platform/update_engine/delta_diff_parser.h
diff --git a/src/platform/update_engine/delta_diff_parser.h b/src/platform/update_engine/delta_diff_parser.h
new file mode 100644
index 0000000000000000000000000000000000000000..5c6d664f79cf6c341b6f166764c5b275859250f8
--- /dev/null
+++ b/src/platform/update_engine/delta_diff_parser.h
@@ -0,0 +1,132 @@
+// Copyright (c) 2009 The Chromium 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 CHROMEOS_PLATFORM_UPDATE_ENGINE_DELTA_DIFF_PARSER_H__
+#define CHROMEOS_PLATFORM_UPDATE_ENGINE_DELTA_DIFF_PARSER_H__
+
+#include <string>
+#include <vector>
+#include "chromeos/obsolete_logging.h"
+#include "base/basictypes.h"
+#include "update_engine/update_metadata.pb.h"
+
+// The DeltaDiffParser class is used to parse a delta file on disk. It will
+// copy the metadata into memory, but not the file data. This class can
+// also be used to copy file data out to disk.
+
+// The DeltaDiffParserIterator class is used to iterate through the
+// metadata of a delta file. It will return directories before their
+// children.
+
+namespace chromeos_update_engine {
+
+class DeltaDiffParser;
+
+class DeltaDiffParserIterator {
+ friend class DeltaDiffParser;
+ public:
+ void Increment();
+
+ // Returns the full path for the current file, e.g. "/bin/bash".
+ // Returns empty string for root.
+ const std::string& path() const {
+ return path_;
+ }
+
+ // Returns the basename for the current file. If path() returns
+ // "/bin/bash", then GetName() returns "bash".
+ // Returns empty string for root
+ const std::string GetName() const;
+
+ const DeltaArchiveManifest_File& GetFile() const;
+ bool operator==(const DeltaDiffParserIterator& that) const {
+ return path_indices_ == that.path_indices_ &&
+ child_indices_ == that.child_indices_ &&
+ path_ == that.path_ &&
+ archive_ == that.archive_;
+ }
+ bool operator!=(const DeltaDiffParserIterator& that) const {
+ return !(*this == that);
+ }
+ private:
+ // Container of all the File messages. Each File message has an index
+ // in archive_. The root directory is always stored at index 0.
+ const DeltaArchiveManifest* archive_;
+
+ // These variables are used to implement the common recursive depth-first
+ // search algorithm (which we can't use here, since we need to walk the
+ // tree incrementally).
+
+ // Indices into 'archive_' of the current path components. For example, if
+ // the current path is "/bin/bash", 'path_stack_' will contain the archive
+ // indices for "/", "/bin", and "/bin/bash", in that order. This is
+ // analogous to the call stack of the recursive algorithm.
+ std::vector<int> path_indices_;
+
+ // For each component in 'path_stack_', the currently-selected child in its
+ // child vector. In the previous example, if "/" has "abc" and "bin"
+ // subdirectories and "/bin" contains only "bash", this will contain
+ // [0, 1, 0], since we are using the 0th child at the root directory level
+ // (there's only one child there), the first of the root dir's children
+ // ("bin"), and the 0th child of /bin ("bash"). This is analogous to the
+ // state of each function (in terms of which child it's currently
+ // handling) in the call stack of the recursive algorithm.
+ std::vector<int> child_indices_;
+
+ std::string path_;
+ // Instantiated by friend class DeltaDiffParser
+ explicit DeltaDiffParserIterator(const DeltaArchiveManifest* archive)
+ : archive_(archive) {}
+ DeltaDiffParserIterator() {
+ CHECK(false); // Should never be called.
+ }
+};
+
+class DeltaDiffParser {
+ public:
+ DeltaDiffParser(const std::string& delta_file);
+ ~DeltaDiffParser();
+ bool valid() const { return valid_; }
+ bool ContainsPath(const std::string& path) const;
+ const DeltaArchiveManifest_File& GetFileAtPath(const std::string& path) const;
+
+ // Reads length bytes at offset of the delta file into the out string
+ // or vector. Be careful not to call this with large length values,
+ // since that much memory will have to be allocated to store the output.
+ // Returns true on success.
+ bool ReadDataVector(off_t offset, off_t length, std::vector<char>* out) const;
+
+ // Copies length bytes of data from offset into a new file at path specified.
+ // If should_decompress is true, will gzip decompress while writing to the
+ // file. Returns true on success.
+ bool CopyDataToFile(off_t offset, off_t length, bool should_decompress,
+ const std::string& path) const;
+
+ typedef DeltaDiffParserIterator Iterator;
+ const Iterator Begin();
+ const Iterator End();
+
+ // The identifier we expect at the beginning of a delta file.
+ static const char* const kFileMagic;
+
+ private:
+ // (Binary) Searches the children of 'file' for one named child_name.
+ // If found, returns the index into the archive. If not found, returns -1.
+ int GetIndexOfFileChild(const DeltaArchiveManifest_File& file,
+ const std::string& child_name) const;
+
+ // Returns -1 if not found, 0 for root
+ int GetIndexForPath(const std::string& path) const;
+
+ // We keep a filedescriptor open to the delta file.
+ int fd_;
+
+ DeltaArchiveManifest archive_;
+ bool valid_;
+ DISALLOW_COPY_AND_ASSIGN(DeltaDiffParser);
+};
+
+}; // namespace chromeos_update_engine
+
+#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_DELTA_DIFF_PARSER_H__
« no previous file with comments | « src/platform/update_engine/delta_diff_generator_unittest.cc ('k') | src/platform/update_engine/delta_diff_parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698