Home | History | Annotate | Download | only in courgette
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "courgette/ensemble.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/strings/string_number_conversions.h"
      9 
     10 #include "courgette/region.h"
     11 #include "courgette/simple_delta.h"
     12 #include "courgette/streams.h"
     13 
     14 namespace courgette {
     15 
     16 Element::Element(ExecutableType kind,
     17                  Ensemble* ensemble,
     18                  const Region& region)
     19     : kind_(kind), ensemble_(ensemble), region_(region) {
     20 }
     21 
     22 Element::~Element() {}
     23 
     24 std::string Element::Name() const {
     25   return ensemble_->name() + "("
     26       + base::IntToString(kind()) + ","
     27       + base::Uint64ToString(offset_in_ensemble()) + ","
     28       + base::Uint64ToString(region().length()) + ")";
     29 }
     30 
     31 // Scans the Ensemble's region, sniffing out Elements.  We assume that the
     32 // elements do not overlap.
     33 Status Ensemble::FindEmbeddedElements() {
     34 
     35   size_t length = region_.length();
     36   const uint8* start = region_.start();
     37 
     38   size_t position = 0;
     39   while (position < length) {
     40     ExecutableType type;
     41     size_t detected_length;
     42 
     43     Status result = DetectExecutableType(start + position,
     44                                          length - position,
     45                                          &type, &detected_length);
     46 
     47     if (result == C_OK) {
     48       Region region(start + position, detected_length);
     49 
     50       Element* element = new Element(type, this, region);
     51       owned_elements_.push_back(element);
     52       elements_.push_back(element);
     53       position += region.length();
     54     } else {
     55       position++;
     56     }
     57   }
     58   return C_OK;
     59 }
     60 
     61 Ensemble::~Ensemble() {
     62   for (size_t i = 0;  i < owned_elements_.size();  ++i)
     63     delete owned_elements_[i];
     64 }
     65 
     66 }  // namespace
     67