diff options
author | sorin@chromium.org <sorin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 20:41:36 +0000 |
---|---|---|
committer | sorin@chromium.org <sorin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 20:41:36 +0000 |
commit | e3e696d3e883f38577252e1a1a6a98ae89dea079 (patch) | |
tree | b5adbe01ec71c10c5f2d37bff9161acc40da2455 /courgette/third_party | |
parent | 0ad74fd43800b179bc3d50847f695d4a902c79ca (diff) | |
download | chromium_src-e3e696d3e883f38577252e1a1a6a98ae89dea079.zip chromium_src-e3e696d3e883f38577252e1a1a6a98ae89dea079.tar.gz chromium_src-e3e696d3e883f38577252e1a1a6a98ae89dea079.tar.bz2 |
Differential updates for components. We are adding support for delivering delta updates for Chrome components. Initial platform support for the patcher is Windows only. The update response includes both the full update and, if available, the differential update. The differential update is tried first, then the full update, if needed.
BUG=245318
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=207805
Review URL: https://chromiumcodereview.appspot.com/15908002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207917 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'courgette/third_party')
-rw-r--r-- | courgette/third_party/bsdiff.h | 10 | ||||
-rw-r--r-- | courgette/third_party/bsdiff_apply.cc | 41 |
2 files changed, 50 insertions, 1 deletions
diff --git a/courgette/third_party/bsdiff.h b/courgette/third_party/bsdiff.h index 5e5683a..77897a8 100644 --- a/courgette/third_party/bsdiff.h +++ b/courgette/third_party/bsdiff.h @@ -30,12 +30,15 @@ * 2009-03-31 - Change to use Streams. Move CRC code to crc.{h,cc} * Changed status to an enum, removed unused status codes. * --Stephen Adams <sra@chromium.org> + * 2013-04-10 - Added wrapper to apply a patch directly to files. + * --Joshua Pawlicki <waffles@chromium.org> */ #ifndef COURGETTE_BSDIFF_H_ #define COURGETTE_BSDIFF_H_ #include "base/basictypes.h" +#include "base/file_util.h" namespace courgette { @@ -44,7 +47,8 @@ enum BSDiffStatus { MEM_ERROR = 1, CRC_ERROR = 2, READ_ERROR = 3, - UNEXPECTED_ERROR = 4 + UNEXPECTED_ERROR = 4, + WRITE_ERROR = 5 }; class SourceStream; @@ -64,6 +68,10 @@ BSDiffStatus ApplyBinaryPatch(SourceStream* old_stream, SourceStream* patch_stream, SinkStream* new_stream); +// As above, but simply takes the file paths. +BSDiffStatus ApplyBinaryPatch(const base::FilePath& old_stream, + const base::FilePath& patch_stream, + const base::FilePath& new_stream); // The following declarations are common to the patch-creation and // patch-application code. diff --git a/courgette/third_party/bsdiff_apply.cc b/courgette/third_party/bsdiff_apply.cc index 762c12c..3ed346e 100644 --- a/courgette/third_party/bsdiff_apply.cc +++ b/courgette/third_party/bsdiff_apply.cc @@ -26,6 +26,8 @@ * Changelog: * 2009-03-31 - Change to use Streams. Move CRC code to crc.{h,cc} * --Stephen Adams <sra@chromium.org> + * 2013-04-10 - Add wrapper method to apply a patch to files directly. + * --Joshua Pawlicki <waffles@chromium.org> */ // Copyright (c) 2009 The Chromium Authors. All rights reserved. @@ -34,6 +36,7 @@ #include "courgette/third_party/bsdiff.h" +#include "base/files/memory_mapped_file.h" #include "courgette/crc.h" #include "courgette/streams.h" @@ -168,4 +171,42 @@ BSDiffStatus ApplyBinaryPatch(SourceStream* old_stream, return OK; } +BSDiffStatus ApplyBinaryPatch(const base::FilePath& old_file_path, + const base::FilePath& patch_file_path, + const base::FilePath& new_file_path) { + // Set up the old stream. + base::MemoryMappedFile old_file; + if (!old_file.Initialize(old_file_path)) { + return READ_ERROR; + } + SourceStream old_file_stream; + old_file_stream.Init(old_file.data(), old_file.length()); + + // Set up the patch stream. + base::MemoryMappedFile patch_file; + if (!patch_file.Initialize(patch_file_path)) { + return READ_ERROR; + } + SourceStream patch_file_stream; + patch_file_stream.Init(patch_file.data(), patch_file.length()); + + // Set up the new stream and apply the patch. + SinkStream new_sink_stream; + BSDiffStatus status = ApplyBinaryPatch(&old_file_stream, + &patch_file_stream, + &new_sink_stream); + if (status != OK) { + return status; + } + + // Write the stream to disk. + int written = file_util::WriteFile( + new_file_path, + reinterpret_cast<const char*>(new_sink_stream.Buffer()), + static_cast<int>(new_sink_stream.Length())); + if (written != static_cast<int>(new_sink_stream.Length())) + return WRITE_ERROR; + return OK; +} + } // namespace |