|  | // Copyright (c) 2011 The Chromium 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 COMPONENTS_COURGETTE_COURGETTE_H_ | 
|  | #define COMPONENTS_COURGETTE_COURGETTE_H_ | 
|  |  | 
|  | #include <stddef.h>  // Required to define size_t on GCC | 
|  |  | 
|  | #include "base/files/file.h" | 
|  | #include "base/files/file_path.h" | 
|  |  | 
|  | namespace courgette { | 
|  |  | 
|  | // Status codes for Courgette APIs. | 
|  | // | 
|  | // Client code should only rely on the distintion between C_OK and the other | 
|  | // status codes. | 
|  | // | 
|  | enum Status { | 
|  | C_OK = 1,  // Successful operation. | 
|  |  | 
|  | C_GENERAL_ERROR = 2,  // Error other than listed below. | 
|  |  | 
|  | C_READ_OPEN_ERROR = 3,  // Could not open input file for reading. | 
|  | C_READ_ERROR = 4,       // Could not read from opened input file. | 
|  |  | 
|  | C_WRITE_OPEN_ERROR = 3,  // Could not open output file for writing. | 
|  | C_WRITE_ERROR = 4,       // Could not write to opened output file. | 
|  |  | 
|  | C_BAD_ENSEMBLE_MAGIC = 5,    // Ensemble patch has bad magic. | 
|  | C_BAD_ENSEMBLE_VERSION = 6,  // Ensemble patch has wrong version. | 
|  | C_BAD_ENSEMBLE_HEADER = 7,   // Ensemble patch has corrupt header. | 
|  | C_BAD_ENSEMBLE_CRC = 8,      // Ensemble patch has corrupt data. | 
|  |  | 
|  | C_BAD_TRANSFORM = 12,  // Transform mis-specified. | 
|  | C_BAD_BASE = 13,       // Base for transform malformed. | 
|  |  | 
|  | C_BINARY_DIFF_CRC_ERROR = 14,  // Internal diff input doesn't have expected | 
|  | // CRC. | 
|  |  | 
|  | // Internal errors. | 
|  | C_STREAM_ERROR = 20,            // Unexpected error from streams.h. | 
|  | C_STREAM_NOT_CONSUMED = 21,     // Stream has extra data, is expected to be | 
|  | // used up. | 
|  | C_SERIALIZATION_FAILED = 22,    // | 
|  | C_DESERIALIZATION_FAILED = 23,  // | 
|  | C_INPUT_NOT_RECOGNIZED = 24,    // Unrecognized input (not an executable). | 
|  | C_DISASSEMBLY_FAILED = 25,      // | 
|  | C_ASSEMBLY_FAILED = 26,         // | 
|  | C_ADJUSTMENT_FAILED = 27,       // | 
|  | }; | 
|  |  | 
|  | // What type of executable is something | 
|  | // This is part of the patch format. Never reuse an id number. | 
|  | enum ExecutableType { | 
|  | EXE_UNKNOWN = 0, | 
|  | EXE_WIN_32_X86 = 1, | 
|  | EXE_ELF_32_X86 = 2, | 
|  | EXE_ELF_32_ARM = 3, | 
|  | EXE_WIN_32_X64 = 4, | 
|  | }; | 
|  |  | 
|  | class SinkStream; | 
|  | class SinkStreamSet; | 
|  | class SourceStream; | 
|  |  | 
|  | class AssemblyProgram; | 
|  | class EncodedProgram; | 
|  |  | 
|  | // Applies the patch to the bytes in |old| and writes the transformed ensemble | 
|  | // to |output|. | 
|  | // Returns C_OK unless something went wrong. | 
|  | Status ApplyEnsemblePatch(SourceStream* old, | 
|  | SourceStream* patch, | 
|  | SinkStream* output); | 
|  |  | 
|  | // Applies the patch in |patch_file| to the bytes in |old_file| and writes the | 
|  | // transformed ensemble to |new_file|. | 
|  | // Returns C_OK unless something went wrong. | 
|  | // This function first validates that the patch file has a proper header, so the | 
|  | // function can be used to 'try' a patch. | 
|  | Status ApplyEnsemblePatch(base::File old_file, | 
|  | base::File patch_file, | 
|  | base::File new_file); | 
|  |  | 
|  | // Applies the patch in |patch_file_name| to the bytes in |old_file_name| and | 
|  | // writes the transformed ensemble to |new_file_name|. | 
|  | // Returns C_OK unless something went wrong. | 
|  | // This function first validates that the patch file has a proper header, so the | 
|  | // function can be used to 'try' a patch. | 
|  | Status ApplyEnsemblePatch(const base::FilePath::CharType* old_file_name, | 
|  | const base::FilePath::CharType* patch_file_name, | 
|  | const base::FilePath::CharType* new_file_name); | 
|  |  | 
|  | // Generates a patch that will transform the bytes in |old| into the bytes in | 
|  | // |target|. | 
|  | // Returns C_OK unless something when wrong (unexpected). | 
|  | Status GenerateEnsemblePatch(SourceStream* old, | 
|  | SourceStream* target, | 
|  | SinkStream* patch); | 
|  |  | 
|  | // Serializes |encoded| into the stream set. | 
|  | // Returns C_OK if succeeded, otherwise returns an error status. | 
|  | Status WriteEncodedProgram(EncodedProgram* encoded, SinkStreamSet* sink); | 
|  |  | 
|  | // Assembles |encoded|, emitting the bytes into |buffer|. | 
|  | // Returns C_OK if succeeded, otherwise returns an error status and leaves | 
|  | // |buffer| in an undefined state. | 
|  | Status Assemble(EncodedProgram* encoded, SinkStream* buffer); | 
|  |  | 
|  | // Adjusts |program| to look more like |model|. | 
|  | // | 
|  | Status Adjust(const AssemblyProgram& model, AssemblyProgram* program); | 
|  |  | 
|  | }  // namespace courgette | 
|  |  | 
|  | #endif  // COMPONENTS_COURGETTE_COURGETTE_H_ |