| // Copyright 2017 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. |
| |
| #ifndef SRC_INCLUDE_PUFFIN_PUFFPATCH_H_ |
| #define SRC_INCLUDE_PUFFIN_PUFFPATCH_H_ |
| |
| #include "base/files/file_path.h" |
| #include "puffin/common.h" |
| #include "puffin/stream.h" |
| |
| namespace puffin { |
| |
| extern const char kMagic[]; |
| extern const size_t kMagicLength; |
| constexpr uint64_t kDefaultPuffCacheSize = 50 * 1024 * 1024; // 50 MB |
| |
| // Status codes for Puffin APIs. |
| // |
| // Client code should only rely on the distinction between P_OK and the other |
| // status codes. |
| // |
| enum Status { |
| P_OK = 1, // Successful operation. |
| |
| P_UNKNOWN_ERROR = 2, // Error other than listed below. |
| |
| P_READ_OPEN_ERROR = 3, // Could not open input file for reading. |
| P_READ_ERROR = 4, // Could not read from opened input file. |
| |
| P_WRITE_OPEN_ERROR = 5, // Could not open output file for writing. |
| P_WRITE_ERROR = 6, // Could not write to opened output file. |
| |
| P_BAD_PUFFIN_MAGIC = 7, // Puffin patch has bad magic. |
| P_BAD_PUFFIN_VERSION = 8, // Puffin patch has wrong version. |
| P_BAD_PUFFIN_HEADER = 9, // Puffin patch has corrupt header. |
| P_BAD_PUFFIN_PATCH_TYPE = |
| 10, // Puffin patch provided an unsupported patch type. |
| P_BAD_PUFFIN_CORRUPT = 11, // Zucchini patch has corrupt data. |
| P_BAD_ZUCC_CORRUPT = 12, // Zucchini patch has corrupt data. |
| P_BAD_ZUCC_OLD_IMAGE = 13, // Old zucchini image invalid. |
| P_BAD_ZUCC_NEW_IMAGE = 14, // New image invalid. |
| |
| P_BAD_TRANSFORM = 15, // Transform mis-specified. |
| |
| P_STREAM_ERROR = 20, // Unexpected error from file_stream.h |
| P_STREAM_NOT_CONSUMED = 21, // Stream has extra data, is expected to be |
| // used up. |
| P_SERIALIZATION_FAILED = 22, // |
| P_DESERIALIZATION_FAILED = 23, // |
| P_INPUT_NOT_RECOGNIZED = 24, // Unrecognized input (not a crx) |
| }; |
| |
| // Applies the puffin patch to deflate stream |src| to create deflate stream |
| // |dst|. This function is used in the client and internally uses bspatch to |
| // apply the patch. The input streams are of type |shared_ptr| because |
| // |PuffPatch| needs to wrap these streams into another ones and we don't want |
| // to loose the ownership of the input streams. Optionally one can cache the |
| // puff buffers individually if non-zero value is passed |max_cache_size|. |
| // |
| // |src| IN Source deflate stream. |
| // |dst| IN Destination deflate stream. |
| // |patch| IN The input patch. |
| // |patch_length| IN The length of the patch. |
| // |max_cache_size|IN The maximum amount of memory to cache puff buffers. |
| Status PuffPatch(UniqueStreamPtr src, |
| UniqueStreamPtr dst, |
| const uint8_t* patch, |
| size_t patch_length, |
| size_t max_cache_size = 0); |
| |
| Status ApplyPuffPatch(const base::FilePath& input_path, |
| const base::FilePath& patch_path, |
| const base::FilePath& output_path); |
| |
| } // namespace puffin |
| |
| #endif // SRC_INCLUDE_PUFFIN_PUFFPATCH_H_ |