Index: filesystem_copier_action.h |
diff --git a/filesystem_copier_action.h b/filesystem_copier_action.h |
index 786c2ab083c3653c928e7685463cc6262343c7b6..6720a47c0c0113dce36c22493a412211a6b2cea5 100644 |
--- a/filesystem_copier_action.h |
+++ b/filesystem_copier_action.h |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2010 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. |
@@ -7,12 +7,17 @@ |
#include <sys/stat.h> |
#include <sys/types.h> |
+ |
#include <string> |
#include <vector> |
+ |
#include <gio/gio.h> |
#include <glib.h> |
+#include <gtest/gtest_prod.h> // for FRIEND_TEST |
+ |
#include "update_engine/action.h" |
#include "update_engine/install_plan.h" |
+#include "update_engine/omaha_hash_calculator.h" |
// This action will only do real work if it's a delta update. It will |
// copy the root partition to install partition, and then terminate. |
@@ -38,7 +43,8 @@ class FilesystemCopierAction : public Action<FilesystemCopierAction> { |
dst_stream_(NULL), |
canceller_(NULL), |
read_in_flight_(false), |
- buffer_valid_size_(0) {} |
+ buffer_valid_size_(0), |
+ filesystem_size_(kint64max) {} |
typedef ActionTraits<FilesystemCopierAction>::InputObjectType |
InputObjectType; |
typedef ActionTraits<FilesystemCopierAction>::OutputObjectType |
@@ -56,6 +62,9 @@ class FilesystemCopierAction : public Action<FilesystemCopierAction> { |
std::string Type() const { return StaticType(); } |
private: |
+ friend class FilesystemCopierActionTest; |
+ FRIEND_TEST(FilesystemCopierActionTest, RunAsRootDetermineFilesystemSizeTest); |
+ |
// Callback from glib when the copy operation is done. |
void AsyncReadyCallback(GObject *source_object, GAsyncResult *res); |
static void StaticAsyncReadyCallback(GObject *source_object, |
@@ -64,16 +73,25 @@ class FilesystemCopierAction : public Action<FilesystemCopierAction> { |
reinterpret_cast<FilesystemCopierAction*>(user_data)->AsyncReadyCallback( |
source_object, res); |
} |
- |
+ |
// Cleans up all the variables we use for async operations and tells |
// the ActionProcessor we're done w/ success as passed in. |
// was_cancelled should be true if TerminateProcessing() was called. |
void Cleanup(bool success, bool was_cancelled); |
- |
+ |
+ // Determine, if possible, the source file system size to avoid copying the |
+ // whole partition. Currently this supports only the root file system assuming |
+ // it's ext3-compatible. |
+ void DetermineFilesystemSize(int fd); |
+ |
+ // Returns the number of bytes to read based on the size of the buffer and the |
+ // filesystem size. |
+ int64_t GetBytesToRead(); |
+ |
// If true, this action is copying to the kernel_install_path from |
// the install plan, otherwise it's copying just to the install_path. |
const bool copying_kernel_install_path_; |
- |
+ |
// The path to copy from. If empty (the default), the source is from the |
// passed in InstallPlan. |
std::string copy_source_; |
@@ -82,14 +100,14 @@ class FilesystemCopierAction : public Action<FilesystemCopierAction> { |
// source/destination partitions. |
GInputStream* src_stream_; |
GOutputStream* dst_stream_; |
- |
+ |
// If non-NULL, the cancellable object for the in-flight async call. |
GCancellable* canceller_; |
- |
+ |
// True if we're waiting on a read to complete; false if we're |
// waiting on a write. |
bool read_in_flight_; |
- |
+ |
// The buffer for storing data we read/write. |
std::vector<char> buffer_; |
@@ -98,7 +116,15 @@ class FilesystemCopierAction : public Action<FilesystemCopierAction> { |
// The install plan we're passed in via the input pipe. |
InstallPlan install_plan_; |
- |
+ |
+ // Calculates the hash of the copied data. |
+ OmahaHashCalculator hasher_; |
+ |
+ // Copies and hashes this many bytes from the head of the input stream. This |
+ // field is initialized when the action is started and decremented as more |
+ // bytes get copied. |
+ int64_t filesystem_size_; |
+ |
DISALLOW_COPY_AND_ASSIGN(FilesystemCopierAction); |
}; |