| Index: third_party/courgette/ensemble.cc
 | 
| ===================================================================
 | 
| --- third_party/courgette/ensemble.cc	(revision 15668)
 | 
| +++ third_party/courgette/ensemble.cc	(working copy)
 | 
| @@ -1,102 +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.
 | 
| -
 | 
| -// *** File comments
 | 
| -
 | 
| -#include "third_party/courgette/ensemble.h"
 | 
| -
 | 
| -#include "base/basictypes.h"
 | 
| -#include "base/logging.h"
 | 
| -#include "base/string_util.h"
 | 
| -
 | 
| -#include "third_party/courgette/image_info.h"
 | 
| -#include "third_party/courgette/region.h"
 | 
| -#include "third_party/courgette/streams.h"
 | 
| -#include "third_party/courgette/simple_delta.h"
 | 
| -
 | 
| -namespace courgette {
 | 
| -
 | 
| -Element::Element(Kind kind, Ensemble* ensemble, const Region& region)
 | 
| -    : kind_(kind), ensemble_(ensemble), region_(region) {
 | 
| -}
 | 
| -
 | 
| -std::string Element::Name() const {
 | 
| -  return ensemble_->name() + "("
 | 
| -      + IntToString(kind()) + ","
 | 
| -      + Uint64ToString(offset_in_ensemble()) + ","
 | 
| -      + Uint64ToString(region().length()) + ")";
 | 
| -}
 | 
| -
 | 
| -// A subclass of Element that has a PEInfo.
 | 
| -class ElementWinPE : public Element {
 | 
| - public:
 | 
| -  ElementWinPE(Kind kind, Ensemble* ensemble, const Region& region,
 | 
| -               PEInfo* info)
 | 
| -      : Element(kind, ensemble, region),
 | 
| -        pe_info_(info) {
 | 
| -  }
 | 
| -
 | 
| -  virtual PEInfo* GetPEInfo() const { return pe_info_; }
 | 
| -
 | 
| - protected:
 | 
| -  ~ElementWinPE() { delete pe_info_; }
 | 
| -
 | 
| - private:
 | 
| -  PEInfo* pe_info_;  // Owned by |this|.
 | 
| -};
 | 
| -
 | 
| -// Scans the Ensemble's region, sniffing out Elements.  We assume that the
 | 
| -// elements do not overlap.
 | 
| -Status Ensemble::FindEmbeddedElements() {
 | 
| -  size_t length = region_.length();
 | 
| -  const uint8* start = region_.start();
 | 
| -
 | 
| -  size_t position = 0;
 | 
| -  while (position < length) {
 | 
| -    // Quick test; Windows executables begin with 'MZ'.
 | 
| -    if (start[position] == 'M' &&
 | 
| -        position + 1 < length && start[position + 1] == 'Z') {
 | 
| -      courgette::PEInfo *info = new courgette::PEInfo();
 | 
| -      info->Init(start + position, length - position);
 | 
| -      if (info->ParseHeader()) {
 | 
| -        Region region(start + position, info->length());
 | 
| -
 | 
| -        if (info->has_text_section()) {
 | 
| -          Element* element = new ElementWinPE(Element::WIN32_X86_WITH_CODE,
 | 
| -                                              this, region, info);
 | 
| -          owned_elements_.push_back(element);
 | 
| -          elements_.push_back(element);
 | 
| -          position += region.length();
 | 
| -          continue;
 | 
| -        }
 | 
| -
 | 
| -        // If we had a clever transformation for resource-only executables we
 | 
| -        // should identify the suitable elements here:
 | 
| -        if (!info->has_text_section() && false) {
 | 
| -          Element* element = new ElementWinPE(Element::WIN32_NOCODE,
 | 
| -                                              this, region, info);
 | 
| -          owned_elements_.push_back(element);
 | 
| -          elements_.push_back(element);
 | 
| -          position += region.length();
 | 
| -          continue;
 | 
| -        }
 | 
| -      }
 | 
| -      delete info;
 | 
| -    }
 | 
| -
 | 
| -    // This is where to add new formats, e.g. Linux executables, Dalvik
 | 
| -    // executables etc.
 | 
| -
 | 
| -    // No Element found at current position.
 | 
| -    ++position;
 | 
| -  }
 | 
| -  return C_OK;
 | 
| -}
 | 
| -
 | 
| -Ensemble::~Ensemble() {
 | 
| -  for (size_t i = 0;  i < owned_elements_.size();  ++i)
 | 
| -    delete owned_elements_[i];
 | 
| -}
 | 
| -
 | 
| -}  // namespace
 | 
| 
 |