15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*-
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2003,2004 Colin Percival
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted providing that the following conditions
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    documentation and/or other materials provided with the distribution.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * POSSIBILITY OF SUCH DAMAGE.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Changelog:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2005-04-26 - Define the header as a C structure, add a CRC32 checksum to
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *              the header, and make all the types 32-bit.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                --Benjamin Smedberg <benjamin@smedbergs.us>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2009-03-31 - Change to use Streams.  Move CRC code to crc.{h,cc}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *              Changed status to an enum, removed unused status codes.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                --Stephen Adams <sra@chromium.org>
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * 2013-04-10 - Added wrapper to apply a patch directly to files.
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *                --Joshua Pawlicki <waffles@chromium.org>
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COURGETTE_BSDIFF_H_
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COURGETTE_BSDIFF_H_
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/file_util.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace courgette {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BSDiffStatus {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OK = 0,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MEM_ERROR = 1,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CRC_ERROR = 2,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  READ_ERROR = 3,
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UNEXPECTED_ERROR = 4,
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WRITE_ERROR = 5
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SourceStream;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SinkStream;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a binary patch.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BSDiffStatus CreateBinaryPatch(SourceStream* old_stream,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SourceStream* new_stream,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               SinkStream* patch_stream);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Applies the given patch file to a given source file. This method validates
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the CRC of the original file stored in the patch file, before applying the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// patch to it.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BSDiffStatus ApplyBinaryPatch(SourceStream* old_stream,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              SourceStream* patch_stream,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              SinkStream* new_stream);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// As above, but simply takes the file paths.
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochBSDiffStatus ApplyBinaryPatch(const base::FilePath& old_stream,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              const base::FilePath& patch_stream,
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              const base::FilePath& new_stream);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following declarations are common to the patch-creation and
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// patch-application code.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The patch stream starts with a MBSPatchHeader.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct MBSPatchHeader_ {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char tag[8];       // Contains MBS_PATCH_HEADER_TAG
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 slen;       // Length of the file to be patched.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 scrc32;     // CRC32 of the file to be patched.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 dlen;       // Length of the result file.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} MBSPatchHeader;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the value for the tag field.  Must match length exactly, not counting
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// null at end of string.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MBS_PATCH_HEADER_TAG "GBSDIF42"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // COURGETTE_BSDIFF_H_
93