Index: third_party/courgette/ensemble.h |
=================================================================== |
--- third_party/courgette/ensemble.h (revision 15668) |
+++ third_party/courgette/ensemble.h (working copy) |
@@ -1,257 +0,0 @@ |
-// Copyright (c) 2009 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. |
- |
-// The main idea in Courgette is to do patching *under a tranformation*. The |
-// input is transformed into a new representation, patching occurs in the new |
-// repesentation, and then the tranform is reversed to get the patched data. |
-// |
-// The idea is applied to pieces (or 'Elements') of the whole (or 'Ensemble'). |
-// Each of the elements has to go through the same set of steps in lock-step, |
-// but there may be many different kinds of elements, which have different |
-// transformation. |
-// |
-// This file declares all the main types involved in creating and applying a |
-// patch with this structure. |
- |
-#ifndef COURGETTE_ENSEMBLE_H_ |
-#define COURGETTE_ENSEMBLE_H_ |
- |
-#include <vector> |
-#include <string> |
- |
-#include "base/basictypes.h" |
- |
-#include "third_party/courgette/courgette.h" |
-#include "third_party/courgette/region.h" |
-#include "third_party/courgette/streams.h" |
- |
-namespace courgette { |
- |
-// Forward declarations: |
-class Ensemble; |
-class PEInfo; |
- |
-// An Element is a region of an Ensemble with an identifyable kind. |
-// |
-class Element { |
- public: |
- enum Kind { WIN32_X86_WITH_CODE, WIN32_NOCODE }; |
- |
- virtual ~Element() {} |
- |
- Kind kind() const { return kind_; } |
- const Region& region() const { return region_; } |
- |
- // The name is used only for debugging and logging. |
- virtual std::string Name() const; |
- |
- // Returns the byte position of this Element relative to the start of |
- // containing Ensemble. |
- size_t offset_in_ensemble() const; |
- |
- // Some subclasses of Element might have a PEInfo. |
- virtual PEInfo* GetPEInfo() const { return NULL; } |
- |
- protected: |
- Element(Kind kind, Ensemble* ensemble, const Region& region); |
- |
- private: |
- Kind kind_; |
- Ensemble* ensemble_; |
- Region region_; |
- |
- DISALLOW_COPY_AND_ASSIGN(Element); |
-}; |
- |
- |
-class Ensemble { |
- public: |
- Ensemble(const Region& region, const char* name) |
- : region_(region), name_(name) {} |
- ~Ensemble(); |
- |
- const Region& region() const { return region_; } |
- const std::string& name() const { return name_; } |
- |
- // Scans the region to find Elements within the region(). |
- Status FindEmbeddedElements(); |
- |
- // Returns the elements found by 'FindEmbeddedElements'. |
- const std::vector<Element*>& elements() const { return elements_; } |
- |
- |
- private: |
- Region region_; // The memory, owned by caller, containing the |
- // Ensemble's data. |
- std::string name_; // A debugging/logging name for the Ensemble. |
- |
- std::vector<Element*> elements_; // Embedded elements discovered. |
- std::vector<Element*> owned_elements_; // For deallocation. |
- |
- DISALLOW_COPY_AND_ASSIGN(Ensemble); |
-}; |
- |
-inline size_t Element::offset_in_ensemble() const { |
- return region().start() - ensemble_->region().start(); |
-} |
- |
-// The 'CourgettePatchFile' is class is a 'namespace' for the constants that |
-// appear in a Courgette patch file. |
-struct CourgettePatchFile { |
- // |
- // The Courgette patch format interleaves the data for N embedded Elements. |
- // |
- // Format of a patch file: |
- // header: |
- // magic |
- // version |
- // source-checksum |
- // target-checksum |
- // multiple-streams: |
- // stream 0: |
- // number-of-transformed-elements (N) - varint32 |
- // transformation-1-method-id |
- // transformation-2-method-id |
- // ... |
- // transformation-1-initial-parameters |
- // transformation-2-initial-parameters |
- // ... |
- // stream 1: |
- // correction: |
- // transformation-1-parameters |
- // transformation-2-parameters |
- // ... |
- // stream 2: |
- // correction: |
- // transformed-element-1 |
- // transformed-element-2 |
- // ... |
- // stream 3: |
- // correction: |
- // base-file |
- // element-1 |
- // element-2 |
- // ... |
- |
- static const uint32 kMagic = 'C' | ('o' << 8) | ('u' << 16); |
- |
- static const uint32 kVersion = 20090320; |
- |
- // Transformation method IDs. |
- enum TransformationMethodId { |
- T_COURGETTE_WIN32_X86 = 1, // Windows 32 bit 'Portable Executable' x86. |
- }; |
-}; |
- |
-// For any transform you would implement both a TransformationPatcher and a |
-// TransformationPatchGenerator. |
-// |
-// TransformationPatcher is the interface which abstracts out the actual |
-// transformation used on an Element. The patching itself happens outside the |
-// actions of a TransformationPatcher. There are four steps. |
-// |
-// The first step is an Init step. The parameters to the Init step identify the |
-// element, for example, range of locations within the original ensemble that |
-// correspond to the element. |
-// |
-// PredictTransformParameters, explained below. |
-// |
-// The two final steps are 'Transform' - to transform the element into a new |
-// representation, and to 'Reform' - to transform from the new representation |
-// back to the original form. |
-// |
-// The Transform step takes some parameters. This allows the transform to be |
-// customized to the particular element, or to receive some assistance in the |
-// analysis required to perform the transform. The transform parameters might |
-// be extensive but mostly predicable, so preceeding Transform is a |
-// PredictTransformParameters step. |
-// |
-class TransformationPatcher { |
- public: |
- virtual ~TransformationPatcher() {} |
- |
- // First step: provides parameters for the patching. This would at a minimum |
- // identify the element within the ensemble being patched. |
- virtual Status Init(SourceStream* parameter_stream) = 0; |
- |
- // Second step: predicts transform parameters. |
- virtual Status PredictTransformParameters( |
- SinkStreamSet* predicted_parameters) = 0; |
- |
- // Third step: transforms element from original representation into alternate |
- // representation. |
- virtual Status Transform(SourceStreamSet* corrected_parameters, |
- SinkStreamSet* transformed_element) = 0; |
- |
- // Final step: transforms element back from alternate representation into |
- // original representation. |
- virtual Status Reform(SourceStreamSet* transformed_element, |
- SinkStream* reformed_element) = 0; |
-}; |
- |
-// TransformationPatchGenerator is the interface which abstracts out the actual |
-// transformation used (and adjustment used) when differentially compressing one |
-// Element from the |new_ensemble| against a corresponding element in the |
-// |old_ensemble|. |
-// |
-// This is not a pure interface. There is a small amount of inheritance |
-// implementation for the fields and actions common to all |
-// TransformationPatchGenerators. |
-// |
-// When TransformationPatchGenerator is subclassed, there will be a |
-// corresponding subclass of TransformationPatcher. |
-// |
-class TransformationPatchGenerator { |
- public: |
- TransformationPatchGenerator(Element* old_element, |
- Element* new_element, |
- TransformationPatcher* patcher); |
- |
- virtual ~TransformationPatchGenerator(); |
- |
- // Returns the TransformationMethodId that identies this transformation. |
- virtual CourgettePatchFile::TransformationMethodId Kind() = 0; |
- |
- // Writes the parameters that will be passed to TransformationPatcher::Init. |
- virtual Status WriteInitialParameters(SinkStream* parameter_stream) = 0; |
- |
- // Predicts the transform parameters for the |old_element|. This must match |
- // exactly the output that will be produced by the PredictTransformParameters |
- // method of the corresponding subclass of TransformationPatcher. This method |
- // is not pure. The default implementation delegates to the patcher to |
- // guarantee matching output. |
- virtual Status PredictTransformParameters(SinkStreamSet* prediction); |
- |
- // Writes the desired parameters for the transform of the old element from the |
- // file representation to the alternate representation. |
- virtual Status CorrectedTransformParameters(SinkStreamSet* parameters) = 0; |
- |
- // Writes both |old_element| and |new_element| in the new representation. |
- // |old_corrected_parameters| will match the |corrected_parameters| passed to |
- // the Transform method of the corresponding sublcass of |
- // TransformationPatcher. |
- // |
- // The output written to |old_transformed_element| must match exactly the |
- // output written by the Transform method of the corresponding subclass of |
- // TransformationPatcher. |
- virtual Status Transform(SourceStreamSet* old_corrected_parameters, |
- SinkStreamSet* old_transformed_element, |
- SinkStreamSet* new_transformed_element) = 0; |
- |
- // Transforms the new transformed_element back from the alternate |
- // representation into the original file format. This must match exactly the |
- // output that will be produced by the corresponding subclass of |
- // TransformationPatcher::Reform. This method is not pure. The default |
- // implementation delegates to the patcher. |
- virtual Status Reform(SourceStreamSet* transformed_element, |
- SinkStream* reformed_element); |
- |
- protected: |
- Element* old_element_; |
- Element* new_element_; |
- TransformationPatcher* patcher_; |
-}; |
- |
-} // namespace |
-#endif // COURGETTE_ENSEMBLE_H_ |