| Index: courgette/third_party/bsdiff_apply.cc
|
| diff --git a/courgette/third_party/bsdiff_apply.cc b/courgette/third_party/bsdiff_apply.cc
|
| index 762c12cf7c8bf7c09787060d4ff09c0cd3c6e9da..3ed346e79af925d0fbcd941d922337f7774127a2 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
|
|
|